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