从 Qt 中的错误中恢复

Posted

技术标签:

【中文标题】从 Qt 中的错误中恢复【英文标题】:Recovering from error in Qt 【发布时间】:2017-12-06 14:21:40 【问题描述】:

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

谢谢

【问题讨论】:

也许你甚至不需要停止事件循环。但是拥有自己的 type 消息队列,您可以清理它。 或者您可以在分析线程中实现错误状态。一旦您处于错误状态,您将跳过所有(新)计算。 【参考方案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();

【讨论】:

以上是关于从 Qt 中的错误中恢复的主要内容,如果未能解决你的问题,请参考以下文章

QT错误中的C ++线程亲和力

Qt 项目 C2872 错误,生成的 ui 文件中的符号不​​明确

尝试继承时Qt中的LNK错误?

Qt中的编译错误

如何从XPages / dojo中的“超时超时”中恢复

试图从备份中恢复 xcode 5 项目,现在出现致命错误