2013-05-29 14 views
7

Qtの内部プロセス全体と、別のスレッドで作業しているときの動作を理解しようとしています。Qt Main-Guiと他のスレッド+イベントループ

私が理解してきたように(Qtのソースコードをグーグルと探検)、以下の通りである:私はexecに呼び出す場合

  • を各スレッドにはローカルの「保留中のイベントリスト」と地元のイベントループを(持っていますそのリストとやりとりします。
  • QCoreApplication::postEvent(obj, e)は、objのスレッドの「保留イベントリスト」に(obj, e)のペアを追加します。
  • 各スレッドにはローカルの「イベントディスパッチャ」(QAbstractEventDispatcher特殊化)があり、これはシステムイベントを読み込むためのものです。したがって、さまざまなプラットフォーム用にQEventDispatchWinQEventDispatchUnixQEventDispatchSymbianなどが存在します。 guiイベントでは、Qtは念頭に置いてこのすべてのでもQEventDispatchX11QEventDispatchUnixから継承)、S60Symbianから)など

があり、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として翻訳されている場合、それらは直接そのターゲットオブジェクトにsendedではされています。
  2. 対象オブジェクトメンバ関数(o.event())は、processEventが実行される同じスレッドで呼び出されます。

そして今、疑問:postEventは、静的およびスレッドセーフな関数であるので

  1. 、QCoreApplicationは、このイベントの処理システムにおいてどのような役割を果たしているのでしょうか?そしてQApplication?彼らはなぜ、できるだけ早く創造されなければならないのですか?
  2. QApplication/QCoreApplicationがシステムイベントを取得するために必須である理由は、各スレッドに独自の「イベントディスパッチャ」がある場合ですか?

私の誓いについてのいかなる訂正も歓迎します。

答えて

2

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

4.8 documenation状態:

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

しかし、一般的にQThreadsについて - 。あなたが提供されたリンクは、スレッドのラッパーであるのQObjectとしてQThreadsを説明見つけるQThreadsは、他のQObjectのように、調整するために、と対話するQCoreApplicationが必要ですので通知/イベント、例えばと、スレッドが終了する。マヤの記事で

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

、彼女はタスクがQThreadに割り当てられている代わりに[すなわち使用信号/スロット内で定義されていると、過負荷にならない例を提供しますrun()メソッド]を呼び出すと、QCoreAppliが提供するメインイベントループカチオンは依然として重要な役割を果たす。

すでに知っているように、このサイトのQThreadsの話題を中心に議論が豊富になっています.Qt4はかなり文書化されています... Qt5 =(

+1

申し訳ありませんが、あなたの返事はとても遅く回答しました。私は今日までそれを理解していませんでした。 –

関連する問題