Qt の内部プロセス全体と、さまざまなスレッドで作業しているときに Qt がどのように機能するかを理解しようとしています。
私が理解しているように(Qtソースコードをグーグルで調べて調べる)、次のとおりです。
exec
各スレッドには、ローカルの「保留中のイベント リスト」と、そのリストとやり取りするローカル イベント ループ ( を呼び出す場合) があります。QCoreApplication::postEvent(obj, e)
のスレッドの(obj, e)
「保留中のイベント リスト」にペアを追加します。obj
- 各スレッドには、システム イベントの読み取りを目的としたローカルの「イベント ディスパッチャ」(
QAbstractEventDispatcher
特殊化) があります。したがって、さまざまなプラットフォーム用にaQEventDispatchWin
、 aQEventDispatchUnix
、 aなどがあります。QEventDispatchSymbian
イベントの場合gui
、Qt にはQEventDispatchX11
(inherits fromQEventDispatchUnix
)、S60
(fromSymbian
) などもあります。
これらすべてを念頭に置いて、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 として変換されると、ターゲット オブジェクトに直接送信されます。
- ターゲット オブジェクト メンバー関数 (
o.event()
) は、同じスレッドで呼び出されprocessEvent
ます。
そして今、疑問:
- は静的でスレッドセーフな関数なので
postEvent
、QCoreApplication はこのイベント処理システムでどのような役割を果たしますか? そしてQApplication?できるだけ早く作成することが義務付けられているのはなぜですか? - 各スレッドに独自の「イベントディスパッチャー」がある場合、システムイベントを取得するために QApplication/QCoreApplication が必須なのはなぜですか?
私の推測に関する修正は大歓迎です。