Próbuję zrozumieć cały proces wewnętrzny Qt i jak to działa, gdy pracuję z różnymi wątkami.Qt Main-Gui i inne pętle zdarzeń + nuty
Jak mam rozumieć (googlowania i odkrywania kodu źródłowego Qt), jest następujący:
- Każdy wątek posiada lokalną „w oczekiwaniu na listę zdarzeń” i lokalną pętlę zdarzeń (jeśli zadzwonię do
exec
), które wchodzą w interakcje z tą listą. QCoreApplication::postEvent(obj, e)
dołącza parę(obj, e)
do "oczekującej listy zdarzeń" wątkuobj
.- Każdy wątek ma lokalny "dispatcher zdarzeń" (specjalizacja
QAbstractEventDispatcher
), który służy do odczytywania zdarzeń systemowych. Tak więc istnieje on dla różnych platform i tak dalej. Dlagui
zdarzeń Qt posiada równieżQEventDispatchX11
(dziedziczy zQEventDispatchUnix
),S60
(odSymbian
) itd
Z tego wszystkiego w umysłu, exec
połączeń działa w następujący sposób:
Thread's `exec`:
├ create a QEventLoop object.
└ call QEventLoop.exec()
└ call repeatedly eventDispatcher's processEvents with WaitForMoreEvents flag.
├ call to QCoreApplication::sendPostedEvents
├ while (!pending system events)
│ ├ read system event
│ ├ create an appropiate QEvent e and detect its target QObject o.
│ └ call to QCoreApplication::sendSpontaneousEvent(o, e)
└ call to QCoreApplication::sendPostedEvents
(for new generated user events in the previous step).
Jeśli quit
lub exit
jest wywoływana, finalizuje bieżące wywołanie processEvents
i zwraca exec
z wartością przekazaną do exit
.
Niektóre punkty bierze pod uwagę:
- Zdarzenia systemowe nie są wypychane/napisali: gdy są one generowane z systemu i tłumaczone jako QEvents, są one bezpośrednio Wysłano wiadomość do jego obiektu docelowego.
- Docelowe funkcje obiektu obiektu (
o.event()
) są wywoływane w tym samym wątku, w którym ma miejsceprocessEvent
.
a teraz wątpliwości:
- Od
postEvent
jest funkcją statycznego i bezpieczny wątku, jaką rolę odgrywają w tym QCoreApplication systemu przetwarzania zdarzeń? I QApplication? Dlaczego są obowiązkowo tworzone tak szybko, jak to możliwe? - Dlaczego QApplication/QCoreApplication są obowiązkowe, aby uzyskać zdarzenia systemowe, jeśli każdy wątek ma własny "moduł rozsyłający zdarzenia"?
Wszelkie poprawki dotyczące moich przykazań są mile widziane.
Przepraszam, że tak późno oznaczyłem odpowiedź jako odpowiedź, ale nie zdawałem sobie z tego sprawy do dzisiaj. –