2012-03-15 10 views
2

this questionで提案されているように、私は現在マルチスレッド化を取り入れようとしています。アプリケーションでQThreadを実装する際の質問はありますか?

the links given by karlphillipによると、QThreadのサブクラス化についての説明は、説明したように、moveToThread()を使用しないことを理解しています。 QThreadのデフォルト実装であるrun()にはexec()しかありません。これは、ワーカースレッドが操作を完了したときにquit()を呼び出すことによって終了する必要があります。私は物事がよりよく理解するように、私は今、いくつかの質問を持っている:私はsomeFunct()内からover()を放出した後もsomeFunct()を使用し続けた場合

QApplication* ptrApp=new QApplication(argc,argv); 
QThread* th=new QThread; 
MyClass* obj=new MyClass; 
obj->moveToThread(th); 
QObject::connect(th,SIGNAL(started()),obj,SLOT(someFunct())); 
QObject::connect(obj,SIGNAL(over()),th,SLOT(quit())); 
th->start(); 
//some GUI code in main thread here 
return ptrApp->exec(); 
  1. はどうなりますか?それは未定義の動作か正常か?

  2. objと関連付けられるスレッドはどれですか(over()を発行した後の残りのコードはまだsomeFunctで実行されています)。私が理解しているのは、quit()そのスレッドが... のときに、thにあることができません。exec()がメインスレッドで実行され、のexec()が終了するまでキューに入れられます。(私はここで間違います)。私はスレッドがもはや存在しないと仮定します。 th用のスロットquit()が実行されると

  3. 、それはスレッドが実際に終了したか、私はさらに絶対に確認するために、いくつかのスロットにthfinished()信号を接続する必要があることを仮定しても安全ですか?

答えて

0

1.私はsomeFunct()内からover()を放出した後もsomeFunct()を使用し続けた場合はどうなりますか?それは未定義の動作か正常か?

するとは直接イベントループを停止する機能quitを呼び出し、スレッドのrunメソッドで幹部から返されますoverを発する、直接接続を使用していたよう。つまり、someFunct()は実行を終了せず、その内部のオブジェクトは失われているか、部分的に変更された状態になっています。

2. objが現在関連付けられているスレッドのうち、残りのコードはsomeFunctで実行中ですが、残りのコードはまだ実行されています)。

前述のようには実行を終了しません。しかし、私はこのスレッドに関連付けられているオブジェクトはそのまま残ると考えています。私は信じていると言います。なぜならどこにも断固たる主張はないからですが、それは一番意味があります。 As mentioned in the doc、これらのオブジェクトは、スレッドが再開されなければならないイベントを送信または受信するために....

3.スロットは目のために()を終了した後に実行され、スレッドが実際に終了するか、すべきたと仮定することは安全です私はさらにいくつかのスロットにthのfinish()シグナルを確実に接続しますか?

quit()はイベントループを終了し、exec()がコールされた場所に戻ります。

オブジェクトQthreadはスレッドではありません。 exec()と入力するまで、それは実行中のメインスレッドです...同様に、execの後に実行されるメインスレッドです。とにかく

これらはイベントループが終了した場合、それは今絶滅ループバック制御を与えるまで、somefunct()を実行し続けますそれを問題ではありません

1
  1. ...いくつかの素晴らしい質問です。

  2. objは、スレッドに関連付けられたままなので、そのスロットの一方に接続された信号が放射されている場合、スロットが実行されませんが、それは、スレッドが再開された場合に場合/のためにキューに入れられます。
    QThreadオブジェクトは、obj->thread()戻り0を削除したので、私はこれがobj->moveToThread(0)を呼び出して、マニュアルに従ってに相当しますと仮定した場合:

    targetThreadがゼロの場合は、すべてのイベントこのオブジェクトの処理とその子が停止。

  3. quit()イベントループを終了し、その後、finished()信号は、スレッドから出射され、スレッドは終了されます。
    finished()シグナルを受信した場合でも、スレッドがまだ完了していると仮定しないでください。その信号を受け取った後、メインスレッドからQThread::waitを使用することができます。
    スレッドが終了状態の場合、QThreadデストラクタはすでにwaitを呼び出しているため、finished()信号(さらに安全になるようにdeleteLater())の後にスレッドを安全に削除することができます。

+0

おかげ 1.屋それは私が気付いた行動だが...ただ、それは/未定義違法または 2. [OK]を何かではないことを確認したかった... plsは私が削除した場合、何が起こるかを教えてくださいQThreadポインタ 'th'(今はもうスレッドを再起動できないので) 3.' quit() 'のために、メインスレッドの' exec() 'が実行されるまでキューに入ることを理解しています...しかし、 'finished()'はイベントループを必要としないシグナルであり、終了スレッドが行うべき究極のものです。なぜなら、 'QThread :: wait()'は、 'finished()'シグナルの使用? – ustulation

+0

2.スレッドを停止して、必要なだけ頻繁に再起動することができます。そして、3.を放出するために、信号はイベントループを必要としません。あなたが接続するスロットは、とにかく実行中のイベントループを持つ別のスレッドになければなりません(スレッドイベントループは独自のfinished()シグナルを受け取ることができません)。しかし、QThreadのソースを調べた後、ほとんどの場合、完了したシグナルを待つことができると思います。 – alexisdm

関連する問題