从 Qt 中的错误中恢复
Recovering from error in Qt
我正在实现一个使用 3 个线程的系统(一个是 GUI,一个是用于数据采集的 TCP 客户端和一个用于计算的分析线程)。
我很难处理其中任何一个的异常。我现在要解决的情况是如果某些计算出错会发生什么,我需要 'freeze' 系统。问题是在某些情况下,我有数据在分析线程的事件循环中等待。我怎样才能安全地清除这个队列,而不处理所有事件(正如我所说,出了点问题所以我不想再做任何计算)。
有没有办法清除特定线程的事件循环?什么时候可以安全删除对象?
谢谢
你的问题不够详细,但我假设你正在使用 QThread
并在其中嵌入 QEventLoop
?
可以调用QEventLoop::exit(-1)
,是线程安全的。
传递给 exit
的值是退出状态,并且将是从 QEventLoop::exec()
编辑的值 return。我选择了 -1,它通常用于表示错误情况。
然后您可以检查 exec()
中的 return 代码,并采取相应的行动。
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();
}
我正在实现一个使用 3 个线程的系统(一个是 GUI,一个是用于数据采集的 TCP 客户端和一个用于计算的分析线程)。 我很难处理其中任何一个的异常。我现在要解决的情况是如果某些计算出错会发生什么,我需要 'freeze' 系统。问题是在某些情况下,我有数据在分析线程的事件循环中等待。我怎样才能安全地清除这个队列,而不处理所有事件(正如我所说,出了点问题所以我不想再做任何计算)。 有没有办法清除特定线程的事件循环?什么时候可以安全删除对象?
谢谢
你的问题不够详细,但我假设你正在使用 QThread
并在其中嵌入 QEventLoop
?
可以调用QEventLoop::exit(-1)
,是线程安全的。
传递给 exit
的值是退出状态,并且将是从 QEventLoop::exec()
编辑的值 return。我选择了 -1,它通常用于表示错误情况。
然后您可以检查 exec()
中的 return 代码,并采取相应的行动。
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();
}