我有一个运行多个线程的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);
}
}
最佳答案
发布事件时,与使用sendEvent
相反,事件指针的所有权转移到接收者对象的事件循环中。
在将事件传递给对象后,即返回对象的event()
方法后,它将删除事件。
因此,如果您需要异步传递信息,则需要复制信息,然后从event()
实现返回