【问题标题】:How to make an assert window in QT如何在 QT 中创建一个断言窗口
【发布时间】:2012-10-29 22:21:25
【问题描述】:

我目前在 QT 中有一个运行时间很长的 GUI 应用程序。稍后,该应用程序将被测试并在没有键盘的嵌入式设备上全屏运行。

为了更容易调试,我有一个自定义断言宏,它允许我忽略某些断言(可能包括我现在必须解决的已知错误部分)等。暂时我只是在控制台上打印一些东西,例如“断言:XXXX 失败;中止/忽略”。当我在控制台中启动应用程序时这很好,但当我在最终设备上运行它时最终失败。在这种情况下,断言只会阻塞等待输入的主线程并使 GUI 严重挂起而没有恢复的希望。

现在我正在考虑如何补救这种情况。一个想法是让断言崩溃,就像标准断言一样。但我不太喜欢这个想法,因为有很多已知问题,而且我一直发现可忽略的断言在测试应用程序时非常有用。此外,我必须将消息放入单独的文件中,以便稍后查看测试时发生的情况。事后阅读这些文件是可能的,但我更喜欢更简单的方法来找出问题所在。

另一个想法是制作一个窗口。然而,断言可以在任何线程中触发,我只能在 GUI 线程中创建新窗口。主事件循环也可能被断言阻塞,所以我不能确定它会正确处理事件。我会在一个单独的线程中以某种方式需要一个完全响应的独立窗口,它只处理几个按钮。

这在 QT4 中可能吗?

【问题讨论】:

    标签: multithreading user-interface qt4 embedded assert


    【解决方案1】:

    您可以将事件发布到主线程以显示对话框并等待非 gui 线程的回答,或者如果当前线程是应用程序线程则仅显示对话框

    int result = -1;
    if ( QTrhead::currentThread() == QCoreApplication::instance()->thread() )
    {
        result = AssertHandler->ShowDialog(where, what, condition);
    }
    else
    {
        QMetaObject::invokeMethod(AssertHandler, "ShowDialog", Qt::QueuedBlockingConnection, Q_RETURN_ARG(int, result), Q_ARG(QString, where), Q_ARG(QString, what), Q_ARG(QString, condition);
    }
    
    if (result != 0)
    {
         // handle assert
    }
    

    AssertHandler 是基于 QObject 的类,带有插槽 int ShowDialog(const QString &where, const QString what, const QString &condition)。它应该显示带有断言数据和按钮断言/忽略的对话框。当用户按下忽略时返回 0,否则返回非零值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-04
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      相关资源
      最近更新 更多