转发从 QCoreApplication::postEvent 收到的 QEvent 是否安全
Is it safe to forward a QEvent recieved from QCoreApplication::postEvent
我有一个 QT C++ 应用程序,它有多个线程 运行,线程使用 QCoreApplication::postEvent 机制相互传递信息。 QCoreApplication::postEvent 文档明确指出事件必须在堆上分配,并且在发布事件后访问事件是不安全的。
http://doc.qt.io/qt-5/qcoreapplication.html#postEvent
当我的应用程序中的一个线程接收到另一个线程发送给它的事件(通过 QObject::event)时,它通常会 "forward" 通过 postEvent 方法将事件发送到另一个线程。 这里安全吗?我是否应该创建一个全新的事件,它是原始事件的副本? 我的应用程序根本没有崩溃....但这并不意味着风险不存在。 什么时候考虑 QT 事件 "posted"?
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);
}
}
当您 post 一个事件时,与使用 sendEvent
相反,事件指针的所有权被转移到接收者对象的事件循环。
它将事件传递给对象后删除事件,即在对象的 event()
方法返回后。
因此,如果您需要异步传递信息,则需要在从 event()
实现返回之前复制它
我有一个 QT C++ 应用程序,它有多个线程 运行,线程使用 QCoreApplication::postEvent 机制相互传递信息。 QCoreApplication::postEvent 文档明确指出事件必须在堆上分配,并且在发布事件后访问事件是不安全的。
http://doc.qt.io/qt-5/qcoreapplication.html#postEvent
当我的应用程序中的一个线程接收到另一个线程发送给它的事件(通过 QObject::event)时,它通常会 "forward" 通过 postEvent 方法将事件发送到另一个线程。 这里安全吗?我是否应该创建一个全新的事件,它是原始事件的副本? 我的应用程序根本没有崩溃....但这并不意味着风险不存在。 什么时候考虑 QT 事件 "posted"?
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);
}
}
当您 post 一个事件时,与使用 sendEvent
相反,事件指针的所有权被转移到接收者对象的事件循环。
它将事件传递给对象后删除事件,即在对象的 event()
方法返回后。
因此,如果您需要异步传递信息,则需要在从 event()
实现返回之前复制它