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

发布于 2024-08-31 01:11:39 字数 601 浏览 6 评论 0原文

正如主题所说,我正在从非 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 线程中,我已经仔细检查过这一点。

我该如何调试这个问题?或者,更好的是,也许完全回避它?

As the subject says, I'm posting events from non-GUI thread (some GStreamer thread, to be precise). Code looks like this:

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;
}

The problem is, stateChanged (doesn't matter whether it is a slot or signal) is not called. I've stepped into QMetaObject::invokeMethod with debugger, followed it till it called PostMessage (it is Qt 4.6.2 on Windows, by the way) – everything seemed to be OK.

Object pointed to by data lives in GUI thread, I've double-checked this.

How can I debug this problem? Or, better, maybe sidestep it altogether?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

少女情怀诗 2024-09-07 01:11:39

0小时我的上帝。

傻了。

我实际上花了来调试这个。

问题如下:

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

    // ...
}

是的,我重新实现了 QObject::event()(为显示/隐藏和调整大小事件添加一些特殊处理),并且没有调用基类方法。而且,猜猜看,Qt::QueuedConnection 使用 QEvent 进行延迟调用。

永远不要做像我一样的事情。真的。

或者,亲爱的 Qt,您可以使用 NVI 来保护我们吗反对这种错误?

0h my god.

I am so stupid.

I've spent literally days debugging this.

And the problem looked like this:

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

    // ...
}

Yes, I've reimplemented QObject::event() (to add some special processing for show/hide and resize events), and did not call the base method. And, guess what, Qt::QueuedConnection uses QEvents to make the deferred calls.

Never do things like I did. Really.

Or, dear Qt, can you please use NVI to guard us against this sort of mistakes?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文