2017-07-03 116 views
2

我正在實現一個使用3個線程(一個是GUI,一個是用於數據採集的TCP客戶端和一個用於計算的分析線程)的系統。 我很難處理任何一個異常。我現在正在嘗試解決的情況是,如果某些計算出錯,會發生什麼情況,我需要「凍結」系統。問題是,在某些情況下,我有數據在分析線程的事件循環中等待。我怎樣才能安全地清除這個隊列,而無需處理所有的事件(正如我所說的,出錯了,所以我不想再進行任何計算)。 有沒有辦法清除特定線程的事件循環?我什麼時候可以安全地刪除對象?從錯誤中恢復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(); 
}