【问题标题】:Is it safe to forward a QEvent recieved from QCoreApplication::postEvent转发从 QCoreApplication::postEvent 收到的 QEvent 是否安全
【发布时间】:2017-07-24 17:29:09
【问题描述】:

我有一个运行多个线程的 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);
    }
}

【问题讨论】:

  • 我不能直接回答你的问题,但我可以指出跨线程/排队信号依赖于事件队列。使用信号和插槽是一种更安全的方法(您不必检查事件类型,因为您可以为每个事件/信号连接到特定插槽)。

标签: c++ multithreading qt qevent qcoreapplication


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2011-09-02
    • 2011-10-02
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多