转发从QCoreApplication :: postEvent收到的QEvent是否安全

时间:2017-03-04 16:52:52

标签: c++ multithreading qt qevent qcoreapplication

我有一个运行多个线程的QT C ++应用程序,并且线程使用QCoreApplication :: postEvent机制相互传输信息。 QCoreApplication :: postEvent文档明确指出必须在堆上分配事件,并且在发布事件后访问该事件是不安全的。

http://doc.qt.io/qt-5/qcoreapplication.html#postEvent

当我的应用程序中的一个线程收到另一个线程发送给它的事件(通过QObject :: event)时,它通常会通过postEvent方法将事件“转发”到另一个线程。 这样安全吗?我是否应该创建一个全新的活动副本?我的应用程序根本没有崩溃......但这并不意味着风险不存在。 QT事件何时被视为“已发布”?

bool MyQObjectDerivedClass::event(QEvent* evnt)
{
    // When  is QEvent considered posted?
    if(evnt->type() == MY_EVENT_TYPE)
    {
        // Forward the event..
        // Is this safe?  Or should I create a copy of the event?
        QCoreApplication::postEvent(myOtherQObjectClassPtr,evnt);
        return true;
    }
    else
    {
        return QObject::event(evnt);
    }
}

1 个答案:

答案 0 :(得分:1)

当您发布事件而不是使用sendEvent时,事件指针的所有权将转移到接收者对象的事件循环。

它会在事件传递给对象后删除,即在对象的event()方法返回后。

因此,如果您需要异步传递信息,则需要在从event()实施返回之前复制它