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();
はどうなりますか?それは未定義の動作か正常か?
obj
と関連付けられるスレッドはどれですか(over()
を発行した後の残りのコードはまだsomeFunct
で実行されています)。私が理解しているのは、quit()
そのスレッドが... のときに、th
にあることができません。exec()
がメインスレッドで実行され、のexec()
が終了するまでキューに入れられます。(私はここで間違います)。私はスレッドがもはや存在しないと仮定します。th
用のスロットquit()
が実行されると、それはスレッドが実際に終了したか、私はさらに絶対に確認するために、いくつかのスロットに
th
のfinished()
信号を接続する必要があることを仮定しても安全ですか?
おかげ 1.屋それは私が気付いた行動だが...ただ、それは/未定義違法または 2. [OK]を何かではないことを確認したかった... plsは私が削除した場合、何が起こるかを教えてくださいQThreadポインタ 'th'(今はもうスレッドを再起動できないので) 3.' quit() 'のために、メインスレッドの' exec() 'が実行されるまでキューに入ることを理解しています...しかし、 'finished()'はイベントループを必要としないシグナルであり、終了スレッドが行うべき究極のものです。なぜなら、 'QThread :: wait()'は、 'finished()'シグナルの使用? – ustulation
2.スレッドを停止して、必要なだけ頻繁に再起動することができます。そして、3.を放出するために、信号はイベントループを必要としません。あなたが接続するスロットは、とにかく実行中のイベントループを持つ別のスレッドになければなりません(スレッドイベントループは独自のfinished()シグナルを受け取ることができません)。しかし、QThreadのソースを調べた後、ほとんどの場合、完了したシグナルを待つことができると思います。 – alexisdm