2017-07-03 92 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(); 
}