2017-07-03 2 views
2

私は3つのスレッドを使用するシステムを実装しています(1つはGUI、1つはデータ取得のためのTCPクライアント、1つは解析スレッドです)。 いずれかの例外を処理するのに苦労しています。私が今解決しようとしているのは、何らかの計算がうまくいかず、システムを「フリーズ」する必要がある場合です。問題は、いくつかのシナリオでは、解析スレッドのイベントループでデータが待機していることです。すべてのイベントを処理せずにこのキューを安全にクリアするにはどうすればいいですか(私が言ったように、何かが間違ってしまったので、これ以上計算をしたくない)。 特定のスレッドのイベントループをクリアする方法はありますか?オブジェクトは安全にいつ削除できますか?Qtのエラーから回復

おかげ

+0

たぶん、あなたもイベントループを停止する必要はありません。しかしあなたの*タイプのメッセージを自分のキューに入れれば、それをきれいにすることができます。 – AlexanderVX

+0

また、解析スレッドでエラー状態を実装することもできます。エラー状態になると、すべての(新しい)計算をスキップします。 – m7913d

答えて

1

あなたの質問には、細部にやや低いですが、私はあなたがQThreadを使用して、その中のQEventLoopを埋め込むていると仮定しますか?

スレッドセーフであるQEventLoop::exit(-1)を呼び出すことができます。

exitに渡される値は終了ステータスであり、QEventLoop::exec()から返される値になります。私は-1を選択しました。これは通常、エラー状態を示すために使用されます。

戻りコードをexec()から確認し、それに応じて動作させることができます。

class AnalysisThread : public QThread 
{ 
    Q_OBJECT 
public: 
    void run() override 
    { 
     int res = _loop.exec(); 
     if (res == -1) 
     { 
      // delete objects 
     } 
    } 

    void exit() 
    { 
     _loop.exit(-1); 
    } 
private: 
    QEventLoop _loop; 
}; 

他の場所で、あなたの例外ハンドラで

try 
{ 
    // ... 
} 
catch(const CalculationError& e) 
{ 
    _analysis_thread.exit(); 
} 
関連する問題