2013-06-07 5 views
6

私はQtの中のワーカースレッドの簡単な側面であると考えているものを確認したいと思います。Qtでは、QThreadのイベントループブロックは、イベントループのスレッドが所有するQObjectのスロットが実行されている間にブロックされますか?

は、私は、その目的は、対応するスレッドに時間のかかる作業を管理することですQThreadを作成したとします。さらに、QThread上でstart()を呼び出して、このスレッドの対応するイベントループを実行できるようにします。作業自体は、QThreadのstarted()シグナルによって通知されるメンバ関数(スロット)によって実行されます。

https://stackoverflow.com/a/11039216/368896からコピー)である:

class Task : public QObject 
{ 
Q_OBJECT 
public: 
    Task(); 
    ~Task(); 
public slots: 
    void doWork() 
    { 
     //very time-consuming code is executed here before the next line is reached... 
     emit workFinished(); // Calls workFinished() signal (after a long time) 
    } 
signals: 
    void workFinished(); 
}; 

// ... in the main thread: 
QThread *thread = new QThread(); 
Task *task = new Task(); 
task->moveToThread(thread); 
connect(thread, SIGNAL(started()), task, SLOT(doWork())); 
connect(task, SIGNAL(workFinished()), thread, SLOT(quit())); 
//automatically delete thread and task object when work is done: 
connect(thread, SIGNAL(finished()), task, SLOT(deleteLater())); 
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); 
thread->start(); 

私の質問は以下の通りです。私は、ワーカースレッドのイベントループがtaskインスタンス上deleteLater()スロットを呼び出すためにfinished()信号からトリガを受信することを理解しています。また、このイベントループはdoWork()関数が戻った後、非常にすぐに実行されますので、それだけで終わりにfinished()の呼び出しによってワーカースレッドのイベントキューに追加されたfinished()信号からトリガを処理する準備して利用できるようになりますdoWork()機能の

Iは、ワーカースレッド内のイベントループがをブロックしていること、(finished()が放出され、doWork()関数が終了する前にされる前に)時間がかかる操作の全過程中doWork()内で実行されることを確認したいですスロット機能doWork()ため、ワーカースレッドがは、任意のスロットに応答されることはありません、時間のかかるdoWork()関数の実行の全過程の間、イベントループのスレッドが所有しているすべてのオブジェクトに対してトリガ。 (したがって、そのようなスロットは、doWork()終了後、ワーカースレッドのイベントループが再度アクティブになった後、finished()シグナルからのトリガーが処理される前にのみ実行されます)。

これは、私は確認したい。

ありがとうございます!

答えて

7

ワーカースレッドのイベントループがブロックされる、信号をやったときに、あなたが得るものである、あなたはシグナルとスロット間の「キューに入れられた」接続のために使用されるものを含む任意のイベントを(処理することができなくなります。すなわちスレッド間の接続を明示的に呼び出さない限り)

ものは、プレーン関数呼び出しであり、実行中のイベントループを必要としないので、あなたはしかし、まだ、ワーカースレッドから放出される信号によってトリガあなたのワーカースレッドで実行スロットを持つことができます。

関連する問題