从Qt中的错误中恢复

时间:2017-07-03 10:36:54

标签: c++ multithreading qt qeventloop

我正在实现一个使用3个线程的系统(一个是GUI,一个是用于数据采集的TCP客户端,一个是用于计算的分析线程)。 我很难处理任何一个例外。我现在试图解决的情况是如果一些计算出错会发生什么,我需要“冻结”系统。问题是在某些情况下,我在分析线程的事件循环中等待数据。如何安全地清除这个队列,而不处理所有事件(正如我所说,出了点问题,所以我不想再做任何计算)。 有没有办法清除特定线程的事件循环?我何时可以安全地删除对象?

由于

1 个答案:

答案 0 :(得分: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();
}