我正在实现一个使用 3 个线程的系统(一个是 GUI,一个是用于数据采集的 TCP 客户端,一个用于计算的分析线程)。我很难处理其中任何一个的异常。我现在试图解决的情况是如果某些计算出错会发生什么,我需要“冻结”系统。问题是在某些情况下,我在分析线程的事件循环中等待数据。如何在不处理所有事件的情况下安全地清除此队列(正如我所说,出了点问题,所以我不想再进行任何计算)。有没有办法清除特定线程的事件循环?我什么时候可以安全地删除对象?
谢谢
我正在实现一个使用 3 个线程的系统(一个是 GUI,一个是用于数据采集的 TCP 客户端,一个用于计算的分析线程)。我很难处理其中任何一个的异常。我现在试图解决的情况是如果某些计算出错会发生什么,我需要“冻结”系统。问题是在某些情况下,我在分析线程的事件循环中等待数据。如何在不处理所有事件的情况下安全地清除此队列(正如我所说,出了点问题,所以我不想再进行任何计算)。有没有办法清除特定线程的事件循环?我什么时候可以安全地删除对象?
谢谢
您的问题在细节上有些低,但我假设您正在使用 aQThread
并将 a 嵌入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();
}