0

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

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

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

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

这在QT4中有可能吗?

4

1 回答 1

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 的带有 slot 的类int ShowDialog(const QString &where, const QString what, const QString &condition)。它应该显示带有断言数据和按钮断言/忽略的对话框。当用户按下忽略时返回 0,否则返回非零值。

于 2012-10-29T14:21:25.607 回答