14

Qtアプリケーションには、メインスレッドとワーカースレッドがあります。ワーカースレッドはQThread、を介してイベントをサブクラス化して処理しますcustomEvent。これは、メインスレッドがワーカースレッドによって処理されるイベントを送信するための正しい方法ですか?

QThread* myWorkerThread = // ...

QApplication::instance()->postEvent (myWorkerThread, new MyWorkRequestEvent(/* ... */);

ドキュメントを正しく読むと、イベントはイベント受信者を所有するオブジェクトのスレッドで処理されると記載されています。メインスレッドによって作成されたのでQThread、それはメインスレッドによって所有されます-それで、このイベントはメインスレッドによって処理されますか(これは直感に反し、私の場合は間違っています)?

4

2 に答える 2

16

あなたの理解は正しく、実際には非常に直感的ではありません:)

多くの問題は、QThreadのサブクラス化を提案するQThreadのドキュメントに起因します。Qthreadには独自のイベントループがありますが、run()メソッドで作成された(そのスレッドで作成された)QObjectのイベントとシグナルのみがQThreadイベントループで処理されます。

スレッドロジックをQObjectサブクラスにカプセル化してから、そのオブジェクトをプレーンQThreadのインスタンスに移動することをお勧めします。次に、シグナル(スレッドの境界を越えて正しくキューに入れられる)またはカスタムイベントを使用して、そのQObjectと通信できます。

この同様の質問には、役立つはずのリンクがいくつかあります。

于 2011-06-01T22:51:04.310 に答える
-1

QApplicationイベントは、またはに存在するメインイベントループによって処理されますQCoreApplication。したがってQObjects、他のスレッドでイベントを送信することは意味がありません(可能かどうかわからない別のイベントループをそこで作成しない限り)。

ただし、他のスレッドからメインスレッドにイベントを送信することはできます。このmyWorkerThread例のは、メインスレッドで作成されているため、メインスレッドが所有しています。以下のワーカースレッドによって作成されたオブジェクトはrun()、このスレッドによって所有されます。

他のスレッドのスロットにシグナルを送信することもできます。たとえば、ワーカースレッドなどからウィジェット(メインスレッドで実行する必要があります)を描画する場合などです。

于 2011-06-01T22:33:24.010 に答える