9

Qt の内部プロセス全体と、さまざまなスレッドで作業しているときに Qt がどのように機能するかを理解しようとしています。

私が理解しているように(Qtソースコードをグーグルで調べて調べる)、次のとおりです。

  • exec各スレッドには、ローカルの「保留中のイベント リスト」と、そのリストとやり取りするローカル イベント ループ ( を呼び出す場合) があります。
  • QCoreApplication::postEvent(obj, e)のスレッドの(obj, e)「保留中のイベント リスト」にペアを追加します。obj
  • 各スレッドには、システム イベントの読み取りを目的としたローカルの「イベント ディスパッチャ」(QAbstractEventDispatcher特殊化) があります。したがって、さまざまなプラットフォーム用にa QEventDispatchWin、 a QEventDispatchUnix、 aなどがあります。QEventDispatchSymbianイベントの場合gui、Qt にはQEventDispatchX11(inherits from QEventDispatchUnix)、S60(from 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

考慮すべきいくつかの点:

  1. システム イベントがプッシュ/ポストされることはありません。システムから生成され、QEvents として変換されると、ターゲット オブジェクトに直接送信されます。
  2. ターゲット オブジェクト メンバー関数 ( o.event()) は、同じスレッドで呼び出されprocessEventます。

そして今、疑問:

  1. は静的でスレッドセーフな関数なのでpostEvent、QCoreApplication はこのイベント処理システムでどのような役割を果たしますか? そしてQApplication?できるだけ早く作成することが義務付けられているのはなぜですか?
  2. 各スレッドに独自の「イベントディスパッチャー」がある場合、システムイベントを取得するために QApplication/QCoreApplication が必須なのはなぜですか?

私の推測に関する修正は大歓迎です。

4

1 に答える 1

3

2 番目の質問への回答として、「各スレッドに独自の「イベント ディスパッチャ」がある場合、システム イベントを取得するために QApplication/QCoreApplication が必須なのはなぜですか?」

4.8 ドキュメントには次のように記載されています。

「QCoreApplication::exec() は、QThread からではなく、常にメイン スレッド (main() を実行するスレッド) から呼び出す必要があることに注意してください。GUI アプリケーションでは、メイン スレッドは唯一のスレッドであるため、GUI スレッドとも呼ばれます。 GUI関連の操作を実行することが許可されています。」

しかし、一般的なQThreadsに関しては、提供されたリンクがQThreadsをスレッドのラッパーであるQObjectsとして説明していることがわかります。そのため、QThreads は、他の QObjects と同様に、通知/イベント (スレッドの終了時など) を調整するために、QCoreApplication と対話する必要があります。

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

Maya の記事では、タスクが QThread 内で定義されるのではなく、割り当てられている例を提供しています [つまり、シグナル/スロットを使用し、run() メソッドをオーバーロードしない]。このように、QCoreApplication によって提供されるメイン イベント ループが依然として重要な役割を果たしていることが明確にわかります。

おそらくすでにご存じのとおり、このサイトでは QThreads のトピックをめぐる議論がすでに豊富に行われています。また、Qt4 については十分に文書化されています... Qt5 についても同じことは言えません =(

于 2013-06-18T20:51:03.683 に答える