Qtの内部プロセス全体と、別のスレッドで作業しているときの動作を理解しようとしています。Qt Main-Guiと他のスレッド+イベントループ
私が理解してきたように(Qtのソースコードをグーグルと探検)、以下の通りである:私はexec
に呼び出す場合
- を各スレッドにはローカルの「保留中のイベントリスト」と地元のイベントループを(持っていますそのリストとやりとりします。
QCoreApplication::postEvent(obj, e)
は、obj
のスレッドの「保留イベントリスト」に(obj, e)
のペアを追加します。- 各スレッドにはローカルの「イベントディスパッチャ」(
QAbstractEventDispatcher
特殊化)があり、これはシステムイベントを読み込むためのものです。したがって、さまざまなプラットフォーム用にQEventDispatchWin
、QEventDispatchUnix
、QEventDispatchSymbian
などが存在します。gui
イベントでは、Qtは念頭に置いてこのすべてのでもQEventDispatchX11
(QEventDispatchUnix
から継承)、S60
(Symbian
から)など
があり、exec
コールは、次のように動作します
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).
の場合quit
またはexit
が呼び出されると、現在のprocessEvents
コールが終了し、exec
の戻り値はexit
に渡されます。
考慮して取るためにいくつかのポイント:
- システムイベントがプッシュされることはありません/投稿:彼らはシステムから生成され、QEventsとして翻訳されている場合、それらは直接そのターゲットオブジェクトにsendedではされています。
- 対象オブジェクトメンバ関数(
o.event()
)は、processEvent
が実行される同じスレッドで呼び出されます。
そして今、疑問:postEvent
は、静的およびスレッドセーフな関数であるので
- 、QCoreApplicationは、このイベントの処理システムにおいてどのような役割を果たしているのでしょうか?そしてQApplication?彼らはなぜ、できるだけ早く創造されなければならないのですか?
- QApplication/QCoreApplicationがシステムイベントを取得するために必須である理由は、各スレッドに独自の「イベントディスパッチャ」がある場合ですか?
私の誓いについてのいかなる訂正も歓迎します。
申し訳ありませんが、あなたの返事はとても遅く回答しました。私は今日までそれを理解していませんでした。 –