Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从Qt错误中恢复_C++_Multithreading_Qt_Qeventloop - Fatal编程技术网

C++ 从Qt错误中恢复

C++ 从Qt错误中恢复,c++,multithreading,qt,qeventloop,C++,Multithreading,Qt,Qeventloop,我正在实现一个使用3个线程的系统(一个是GUI,一个是用于数据采集的TCP客户端,一个用于计算的分析线程)。 我很难处理任何一个的异常。我现在要解决的问题是,如果计算出错,我需要“冻结”系统。问题是,在某些场景中,我的数据在分析线程的事件循环中等待。如何在不处理所有事件的情况下安全地清除此队列(如我所说,出现了一些问题,因此我不希望再进行任何计算)。 有没有办法清除特定线程的事件循环?何时可以安全删除对象 谢谢您的问题在细节上有点不够详细,但我假设您正在使用QThread并在其中嵌入QEvent

我正在实现一个使用3个线程的系统(一个是GUI,一个是用于数据采集的TCP客户端,一个用于计算的分析线程)。 我很难处理任何一个的异常。我现在要解决的问题是,如果计算出错,我需要“冻结”系统。问题是,在某些场景中,我的数据在分析线程的事件循环中等待。如何在不处理所有事件的情况下安全地清除此队列(如我所说,出现了一些问题,因此我不希望再进行任何计算)。 有没有办法清除特定线程的事件循环?何时可以安全删除对象


谢谢

您的问题在细节上有点不够详细,但我假设您正在使用
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();
}

也许你甚至不需要停止事件循环。但是拥有自己类型的消息队列,您可以清理它,也可以在分析线程中实现错误状态。一旦处于错误状态,将跳过所有(新)计算。