QThread和执行通知

时间:2016-07-01 11:14:26

标签: c++ qt qthread qapplication

在多线程Qt应用程序中重新实现notify函数时需要注意什么? 这是一个示例实现。 目前没有错误,但我担心由于Qt中的多线程使用信号槽进行使用通知功能的通信,因此可能会出现错误。

TApplication::notify(QObject *receiver, QEvent *event)
{
    bool returnValue(false);
    try
    {
        returnValue = QApplication::notify(receiver, event);
    }
    catch (IExceptionBase& e)
    {
        if (!fMain.isNull())
        {
            //report error to output and file log
        }
        else
        {
            //report error to output
        }
    }
    catch (...)
    {
        if (!fMain.isNull())
        {
            //report error to output and file log
        }
        else
        {
            //report error to output
        }
    }
    return returnValue;
}

fMain是一个具有报告功能的模块

2 个答案:

答案 0 :(得分:2)

在Qt5中,这是安全的。但是,from the documentation,在Qt6中,这将不再在主线程之外工作,事实上,该函数正在考虑在Qt6中完全弃用。

正如Kuba Ober指出的那样,重新实现notify以捕获异常是一个坏主意,因为其他线程中的事件和任何排队的信号都是异步传递的。

答案 1 :(得分:2)

捕获notify中的所有异常是一种反模式。曾经很酷,但事实证明这是一个坏主意。所以不要这样做。如果您的插槽或事件处理程序抛出,请将其代码包装在try-catch块中。 notify给你一种错误的安全感,因为在很多情况下,恰好从事件处理程序调用信号和直接连接的槽。但有时情况并非如此,并且由于未处理的异常,您的代码将崩溃。

确保您熟悉Core C++ Error Handling GuidelinesC++ Exceptions and Error Handling FAQ