Wpis z mikrobloga

Robię aplikację w qt która ma wysyłać przez port szeregowy komendy do kilkudziesięciu urządzeń. Po wciśnięciu przycisku start zaczynam wysyłać zadane wcześniej komendy po kolei do wszystkich urządzeń. Po wysłaniu komendy czekam na odpowiedź urządzenia. Robię to funkcją waitForReadyRead, niestety powoduje to zablokowanie GUI i nie mogę zatrzymać operacji w trakcie działania. Czytałem na temat wątków, ale raczej to nie pomoże przy stosowaniu wyżej wymienionej funkcji. W skrócie: jest pętla for która przemiata po wszystkich COMach i wysyła komendę, potem wysyłana jest kolejna komenda po wszystkich COMach która powoduje, że urządzenie wyśle informacje o statusie. Te 2 komendy wysyłane są x razy. Problem jest taki, że muszę poczekać na odpowiedź i teraz robię to funkcją waitForReadyRead. Niestety nie mogę przyciskiem stop zatrzymać działania mojego "wspaniałego dzieła" bo GUI nie odpowiada. Jak to zrobić żeby GUI działało i żeby dało się czekać na informacje o statusie?
#programowanie #cpp #qt
  • 6
@MamCieNaHita: Zastanawiałem się nad tym tylko nie jestem pewien jednej rzeczy. Chcę zachować kolejność działań: rozkaz1, rozakaz2, odpowiedź; rozkaz1, rozkaz2, odpowiedź, itd. Jeżeli się podepnę pod readyRead to jaką mam pewność, że kolejność będzie taka jak napisałem? Sytuacja jest następująca: po kliknięciu start wysyłam w forze rozkaz1 do 15 portów po kolei, następnie w kolejnym forze wysyłam rozkaz2 do 15 portów po kolei (rozkaz2 powoduje, że urządzenia zaczną odpowiadać), następnie w
@Chandox: zliczasz gdzieś odpowiedzi i sprawdzasz: jeżeli przyszły wszystkie odpowiedzi => rozsyłasz kolejną serię

EDIT: oczywiście sprawdzasz przy odbieraniu każdej odpowiedzi
EDIT2: licznik przydałby się jakiś atomowy
@MamCieNaHita napotkałem mały problem. Wykorzystanie sygnałów i slotów działa ale niestety tylko dla jednego obiektu w moim przypadku jest to coś takiego:
devices=new QSerialPort(this).
Wtedy robię taki myk:
connect(devices, SIGNAL(readyRead()), this, SLOT(proceedRead()))
Wszystko pięknie działa. Niestety jak zrobię obiekt devices w formie tablicy dynamicznej to dupa blada i funkcja proceedRead się nie wywołuje.
devices=new QSerialPort[rozmiar]
Jak to ugryźć? Robię tablicę dynamiczną bo nie wiem ile urządzeń zostanie podłączonych.
@Chandox: Robienie osobnego wątku w Qt nie jest trudne ale dopóki nie obrabiamy dużej ilości danych to tylko jest niepotrzebne i tylko zajmuje zasoby.
Jednak czekanie na cokolwiek co może zawiesić UI powinno być robione przez sygnały.
QSerialPort::readyRead zgłasza ci że są nowe dane, ale nie robi tego gdy obsługujesz więc bezpiecznie niczego nie pominiesz. Jeżeli nie czytasz wszystkiego co już przyszło poprzez readAll() to by nie zawiesić wątku powinieneś sprawdzić