2013-05-29 22 views
7

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ątku obj.
  • 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. Dla gui zdarzeń Qt posiada również QEventDispatchX11 (dziedziczy z QEventDispatchUnix), S60 (od Symbian) 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ę:

  1. 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.
  2. Docelowe funkcje obiektu obiektu (o.event()) są wywoływane w tym samym wątku, w którym ma miejsce processEvent.

a teraz wątpliwości:

  1. 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?
  2. 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.

Odpowiedz

2

W odpowiedzi na twoje drugie pytanie, "Dlaczego QApplication/QCoreApplication są obowiązkowe, aby uzyskać zdarzenia systemowe, jeśli każdy wątek ma swój własny" dyspozytor zdarzeń "?"

Państwa 4,8 Documenation:

„Należy pamiętać, że QCoreApplication :: exec() zawsze musi być wywoływana z głównego wątku (wątku, który wykonuje main()), a nie z QThread W zastosowaniach graficznych. główny wątek jest również nazywany wątkiem GUI, ponieważ jest to jedyny wątek, który może wykonywać operacje związane z GUI."

Ale dotyczące QThreads w ogóle. - Znajdziesz link pod warunkiem opisuje QThreads jak QObjects że jest opakowaniem wokół wątków Więc QThreads, podobnie jak wszelkie inne QObjects, wymagają interakcji z QCoreApplication w celu koordynowania Powiadomienia/wydarzenia, na przykład wtedy, gdy kończy wątku.

http://qt-project.org/forums/viewthread/14806

W artykule Maya, stanowi ona przykład, w którym zadania są przypisane do QThread zamiast być zdefiniowana w [czyli sygnały użytkowania/szczeliny i nie przeciążać metoda run()] W ten sposób wyraźnie widać, że główna pętla zdarzeń dostarczona przez QCoreAppli nadal odgrywa kluczową rolę.

Jak już zapewne wiesz, na tej stronie było już mnóstwo dyskusji dotyczących tematu QThreads - a Qt4 jest dość dobrze udokumentowane ... nie można powiedzieć tego samego dla Qt5 = (

+1

Przepraszam, że tak późno oznaczyłem odpowiedź jako odpowiedź, ale nie zdawałem sobie z tego sprawy do dzisiaj. –