2016-05-11 8 views
0

いつでも安全に停止できるように、管理可能なバックグラウンドスレッドをいくつか実行する必要があります。スレッドはいくつかの繰り返し可能な作業を行う必要があります。 QThreadで管理可能なバックグラウンドスレッドを実行する適切な方法

は私がマニュアルを読み、私が見つけることができる最良の方法は、QThreadのサブクラスを作成し、実行を再実装する()メソッドである:私は別のスレッドでコードを実行することができますし、私は必要がないので、私はこれが好き

class BackgroundThread: public QThread 
{ 
    Q_OBJECT 

    virtual void run() Q_DECL_OVERRIDE 
    { 
     while (true) 
     { 
      // do some routine task 
      // sleep ... 
     } 
    } 
}; 

moveToThreadで不都合なQtマジックを行い、スレッドリソースを適切に管理するために最大10個のシグナル/スロットを接続します。

問題は、スレッドを安全に停止する方法が見つからないことです。私は、実行のランダムな場所で終了したくないので、次回の繰り返しが終わると停止するようにしたいと思います。これを実現する唯一の方法は、スレッドクラスに原子フラグを追加し、それを停止する必要があるときにメインスレッドから設定することですが、実際にはこの解決策が嫌いです。

Qt5を使用して管理可能なバックグラウンドスレッドを実装する最良の方法は何ですか?

+0

ループの代わりにsetTimer(0)を試すことができます – user1887915

答えて

1

魔法と「10個の信号/スロット」は必要ありません。あなたのコードで

class Worker: public QObject 
{ 
    ... 
public slots: 
    void routineTask(); 
} 

どこか:ちょうどあなたの労働者を作成

QThread bckgThread; 
bckgThread.start(); 
Worker worker; 
worker.moveToThread(&bckgThread); 

はそれを呼び出すか、 QMetaObject::invokeMethodを使用する routineTaskスロットにいくつかの信号を接続します。 そして、あなたは、スレッドで行われ、ちょうど呼び出し:

bckgThread.quit(); 
bckgThread.wait(); 

かなり単純なパターンだこと。なぜ難しい道を行くとサブクラスQThread

関連する問題