9

プログラムを終了する前に、メインスレッドから作成されたすべてのスレッドがジョブを終了するまでメインスレッドを強制的に待機させる方法はありますか。つまり:

int main(){
    QthreadClass a; // in cons' a thread is created and running
    QthreadClass b; // same as before

    *** wish to wait till both created thread finished their jobs ***

    return 0;

}

4

2 に答える 2

14

さて、どうですか:

a.wait();
b.wait();

または、両方のスレッドが終了したときに終了するイベントループ(通常はQtアプリケーションの場合)を開始することもできます(QThreadはfinished()およびterminate()シグナルを発行します)。

于 2013-03-10T15:51:19.853 に答える
5

通常、Qtを使用すると、シグナルとスロットを備えたイベントループを備えたQApplicationベースのクラスが作成されます。このクラスは、必要になるまでメイン関数を終了しません。その場合、QThread :: finish()シグナルを、すべてのスレッドが完了したかどうかをチェックするスロットに接続するだけです。

イベントループとシグナル/スロットがない場合、Qtスレッドには他のスレッド実装に見られるjoin()メソッドがありませんが、QThread :: wait()は多少似ています。

bool QThread::wait(unsigned long time = ULONG_MAX)

次のいずれかの条件が満たされるまで、スレッドをブロックします。

  • このQThreadオブジェクトに関連付けられているスレッドは実行を終了しました(つまり、から戻ったときQThread::run())。trueスレッドが終了すると、この関数が返されます。trueスレッドがまだ開始されていない場合にも返されます。
  • timeミリ秒が経過しました。時間がULONG_MAX(デフォルト)の場合、待機はタイムアウトしません(スレッドはから戻る必要がありますQThread::run())。false待機がタイムアウトした場合、この関数は戻ります。

メインスレッドをブロックすることは、計算を行っても、何かを待つだけではなく、ひどい習慣と見なされていることに注意してください。数十ミリ秒を超えると、ユーザーエクスペリエンスに悪影響を及ぼします。ストールが大きくなると、OSから「このアプリが応答していません」というメッセージが表示される可能性があります。結果を待つ場合は、別のスレッドでそれを待ち、完了したらメインスレッドにのみ渡します。

于 2013-03-10T15:59:20.880 に答える