Wpis z mikrobloga

Robię program w QT odbierający pakiety wysyłane po UDP, które ma pokazywać na ekranie (konkretnie w QLabel). Problem w tym, że program mi się wywala po odebraniu pierwszego pakietu. (Program nieoczekiwanie zakończył pracę). Po odpaleniu debuggera wskazało mi jedną z linii, odpowiadającą za wyświetlenie tekstu w oknie. Pytanie: co robię źle?

Kod

#programowanie #qt #kiciochpyta
  • 28
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@zacietrzewiony: datagram.resize(odbieranie->pendingDatagramSize()+1);

odbieranie->readDatagram(datagram.data(), datagram.size());

datagram->data()[datargam.size()-1] = 0;

ui->obszar->setText(datagram.data());
  • Odpowiedz
@Vetinari: no właśnie, a jak nie tworzył wątków i nie używał QObject::moveToThread(QThread*), to wszysko działa w głównym wątku aplikacji

czyli zarówno odbieranie jak i this znajdują się w tym samym wątku, więc nie ma znaczenia czy jest użyte Qt::QueuedConnection czy Qt::DirectConnection, miałoby to znaczenie, gdyby przeniósł obiekt odbieranie do innego wątku.

odnośnie wątków, pętli zdarzeń, itp. polecam artykuł: http://qt-project.org/wiki/ThreadsEventsQObjects
  • Odpowiedz
@Vetinari: Asynchronicznie w tym przypadku nie jest równoznaczne z utworzeniem wątku. Można z resztą łatwo sprawdzić czy slot wywoływany jest w tym samym wątku, porównać wewnątrz slotu QThread::currentThread() z QApplication::thread(), mogę się założyć, że będzie to samo.
  • Odpowiedz
@Vetinari: nie zagłębiałem się w niskopoziomową obsługę socketów (warstwy poniżej QTcpSocket i QUdpSocket) pewnie pod spodem siedzą jakieś wątki ale z poziomu osoby używającej socketów w Qt nie jest to widoczne. Sprawdziłem i slot wywołuje się w głównym wątku, więc może modyfikować GUI.

@zacietrzewiony

Ale zeszliśmy z tematu, a ja chyba mam rozwiązanie zagadki:

w konstruktorze brak wywołania ui->setupUi(this); które tworzy obiekt QLabel i przypisuje wskaźnik do ui->label.
  • Odpowiedz