2016-08-30 26 views
1

私は受信サーバがQThreadです。すぐにQThreadの作業を一時停止したいです。まったく待ってはいませんが、終了するのとほぼ同じです。Qt、すぐにQThreadを一時停止するには

+2

いくつかのコードを提供できますか?今あなたが意味することは明らかではありません。ご覧のとおり、msleepメソッドはスレッドの作業をすぐに一時停止します。それはあなたが望むものですか? –

+1

_ "ナイフのように切る必要があります" _ O_o –

+0

QThreadの実行機能が信号を発信します。私はシグナルによって放出された奇妙な作品を終わらせたい。 –

答えて

11

任意のスレッドで実行されているコードは、コードおよび/またはC/C++ランタイムまたは使用されている他のライブラリの共有データ構造の状態を破損することなく、任意の時点で停止することはできません。

コードは明確に定義されたポイントでのみ停止できます。

(あなたがQThreadから派生していないか、そのrunをオーバーライドしない場合、すなわち通常は)それはそれが安全だイベントループに制御を戻したら、その後、QThread::quit()がスレッドを停止しますあなたのスレッドはイベントループを実行している場合そうする。あなたのスレッドの再実装が実行され、そこにループを実行する場合は、割り込みが要求されたときに

は、それは返す必要があります:

void MyThread::run() { 
    while (! isInterruptionRequested()) { 
    ... 
    } 
} 

このようなスレッドはQThread::requestInterruption()によって停止可能です。

  • wait()ブロック呼び出し側のスレッドと呼ばれるスレッドが終了するまで:

    参考のため、ここでは時々混乱しているQThreadの様々な方法があります。もちろん、スレッド自体から呼び出すことは即座にデッドロックです。スレッドは、決して起こらない何かを待っていると終了できません。

  • quit()はスレッドのイベントループをできるだけ早く終了し、QThread::run()を返します。 run()を再実装してもイベントループを回さない場合は何もしません。

  • requestTermination()は、YourThread::run()のカスタムループがisTerminationRequested()で確認できるフラグを設定します。

  • terminate()スレッドを停止しますです。これは一般にアプリケーションの状態を破壊しますので、すぐにabort()を実行するか、結果に直面する必要があります。この方法は一番忘れてしまいます。これは基本的には「すぐにこのプロセスがクラッシュし、ディスク・データが破損する」という意味です。

関連する問題