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: Problem jest prawdopodobnie gdzieś wcześniej w kodzie. Krzyż na drogę i powodzenia. Ostatnie co mi przychodzi do głowy - readDatagram coś zwraca? Może ilość bajtów, które rzeczywiście się odebrały? Może ona nie jest równa pendingDatagramSize() ? Może przy okazji któraś z tych wartości nie jest równa 3?
  • Odpowiedz
@WolverinePL: No, w głównym wątku ale sygnały itp są wykonywane w QEventLoop, tam jest trochę pomieszane. ui-> wskazuje na okno robione w QtCreator, raczej powinien być poprawny wskaźnik.
  • Odpowiedz
@zacietrzewiony: Możesz pokazać więcej kodu? Bo tak trudno ocenić. Ewentualnie może nie być miejsca na stosie na resize(), nie wiem jak to działa w QByteArray, mogę jutro w pracy sprawdzić, bo tam mam całe SDK na linuksie zbudowane z debug.
  • Odpowiedz
@zacietrzewiony: Wydaje mi się, że to:

connect(odbieranie, SIGNAL(readyRead()),this, SLOT(odbieranyciagznakow()));

może powodować, że setText() zostanie wywołany w innym wątku niż działa pętla zdarzeń okna, spróbuj w connect użyć: Qt::QueuedConnection.
  • Odpowiedz
@Vetinari : Qt::QueuedConnection daje chyba tylko to, że jak obiekt jest przeniesiony do innego wątku to slot wywoła się w tym wątku, przy Qt::DirectConnection slot wywołałby się w wątku z którego jest emitowany sygnał.

@zacietrzewiony: tworzyłeś jakieś wątki w tym projekcie (instancje klasy QThread lub pochodnych)?
  • Odpowiedz