QMutex - czy dobrze rozumiem?

0

Witam, nie wiem czy dobrze zrozumiałem pojęcie Mutexów. Otóż napisałem do testów prościutki programik składający się z MainWindow i jednego procesu.

Proces w zasadzie odlicza do 200 i wypisuje za każdym obiegiem pętli zmienną (i) poprzez qDebug(), jeżeli i==100 emituje sygnał, który odbieram w MainWindow.

I teraz jeżeli chciałbym proces zatrzymać na pewien czas, dopóki nie wykonam pewnych rzeczy w tym MainWindow powinienem użyć Mutexów?

Zamieszczam prosty kod, byłbym wdzięczny za sugestię czy dobrze zrozumiałem pojęcie Mutexów w QT, jeżeli nie to proszę o poprawienie mnie.

jakas.h: http://4programmers.net/Pastebin/1468
jakas.cpp: http://4programmers.net/Pastebin/1469
MainWindow.h: http://4programmers.net/Pastebin/1470
MainWindow.cpp: http://4programmers.net/Pastebin/1471

Po wklejeniu już kodów na koniec każdego qDebug() dodałem instrukcję flush. I w sumie wygląda na to, że mutexy działają. Tekst ze slotu w MW wypisuje się w okolicach i==100. Jednak zdarzają się przypadki, że i na samym końcu, więc jak to jest z tymi mutexami? :)

1

QMutex jest tu zupełnie niepotrzebny!
Zrobiłeś "klasa->moveToThread(thread);" i wykonałeś połączanie typu queued (domyślne połączenie, gdy łączone obiekty należą do innych wątków - patrz dokumentacja connect).
Efekt jest taki, że twój slot jest ZAWSZE wywoływany w głównym wątku (co jest prawidłowym i zalecanym rozwiązaniem).
Skoro jednak slot jest wywoływany zawsze z jednego wątku mutex nie ma co robić (jest zbędny).

0

Jak zwykle konkretna odpowiedź, dzięki :)

Czyli, jeżeli dwa różne sygnały są połączone z jednym slotem, to w przypadku gdy mutex jest zablokowany drugi proces czeka aż mutex zostanie odblokowany?

0

NIE!
Między slotem a sygnałem masz połączenie kolejkowe (queued). Gdy emitowany jest sygnał qt opanowuje go i wysyła do innego wątku, a bieżący wątek działa dalej normalnie. Wątek główny odbiera wiadomość od sygnału za pomocą event loop i wywołuje odpowiedni slot. Masz tu wywołanie asynchroniczne.
Efekt jest taki że wszystkie operacje na main window wykonują się w głównym wątku, ergo synchronizacja/muteks jest zbędna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1