如何调试Qt中非GUI线程发布的丢失事件?

时间:2010-05-02 13:45:00

标签: qt events multithreading gstreamer

正如主题所说,我是从非GUI线程发布事件(确切地说是一些GStreamer线程)。代码如下所示:

GstBusSyncReply on_bus_message(GstBus* bus, GstMessage* message, gpointer data)
{
    bool ret = QMetaObject::invokeMethod(static_cast<QObject*>(data), "stateChanged", Qt::QueuedConnection);
    Q_ASSERT(ret);

    return GST_BUS_PASS;
}

问题是,stateChanged(无论是插槽还是信号)都没有被调用。我已经使用调试器进入QMetaObject::invokeMethod,然后跟着它调用PostMessage(顺便说一下,它是Windows上的Qt 4.6.2) - 一切似乎都没问题。

data指向的对象存在于GUI线程中,我已经仔细检查了这一点。

如何调试此问题?或者,更好的是,可能完全回避它?

1 个答案:

答案 0 :(得分:1)

我的上帝啊。

所以愚蠢。

我花了很多时间调试这个。

问题看起来像这样:

bool VideoWidget::event(QEvent* e)
{
    if (!impl_)
        return false;

    // ...
}

是的,我已重新实现QObject::event()(为show / hide和resize事件添加一些特殊处理),没有调用基本方法。并且,猜猜是什么,Qt::QueuedConnection使用QEvent来进行延期调用。

永远不要像我那样做。真。

或者,亲爱的Qt,您可以使用NVI来防范这类错误吗?