基于QObject的类与自身具有延迟连接关系

7
我正在查看一些我正在工作的源代码。我发现有一个奇怪的语句是由某人编写的。源代码是一个带有QML GUI的GUI应用程序,使用QT 4.7.x。
下面的片段属于核心应用逻辑。
// connect signal-slots for decoupling
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this, 
    SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection);

这个对象通过排队连接与自身建立连接,这似乎很奇怪,因为这意味着这个对象可以同时存在于不同的线程中?

乍一看,这对我来说没有任何意义。是否有人可以想到这种连接可能是可行或需要的理由?这样做会起作用吗?

2个回答

12

它将在没有任何问题的情况下工作。可能需要在调用SetCurrentTaskSlot之前进行一些事件循环处理?

请注意,QueuedConnection并不意味着某些内容在不同的线程中运行。QueuedConnection仅意味着当信号发射时,相应的槽不会直接被调用。它将被排队在事件循环中,并且在控制权回到事件循环时将被处理。


明白了,我还在看代码周围的事情。一旦弄清楚发生了什么,我会回来的。 - Vikas Bhargava
2
看起来在执行某些计算时会发出任务变更信号,并且“变更”不应立即发生,而是在当前流程执行完毕并恢复事件处理后再发生。 - Vikas Bhargava

4
排队连接并不涉及接收器的位置。相反,为了安全地向另一个线程中的对象发送信号,您必须使用排队连接。但是您可以将其用于任何线程中的对象!
使用排队连接可确保信号将从事件循环内部传递,而不是像直接连接一样立即从发射站点传递。直接连接在概念上是在列表上调用函数指针的一组调用。排队连接在概念上是向聪明的接收器发送事件,该接收器可以根据事件内容执行函数调用。
事件是内部的 QMetaCallEvent,并且是 QObject::event 处理此事件并执行调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接