我正在深入研究我正在研究的一些源代码。我找到了一个有人编码的特殊声明。源代码是带有QML GUI的GUI应用程序,使用QT 4.7.x。
下面的代码段属于核心应用程序逻辑。
// connect signal-slots for decoupling
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this,
SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection);
奇怪的是,对象通过排队连接连接到自身,这实际上意味着对象可以同时“生活”在不同的线程中?
乍一看,这对我没有任何意义。任何人都可以想到为什么这种联系似乎是合情合理的还是需要的?这甚至会起作用吗?答案 0 :(得分:10)
它没有任何问题。也许在调用SetCurrentTaskSlot之前需要一些事件循环处理?
请注意,QueuedConnection并不意味着某些东西在不同的线程中。 QueuedConnection仅表示发出信号时,不会直接调用相应的槽。它将在事件循环中排队,并在将控制权返回给事件循环时进行处理
答案 1 :(得分:3)
排队连接并不意味着接收器的位置。相反的情况是:要安全地将信号发送到另一个线程中的对象,您必须使用排队连接。但是你可以将它们用于生活在任何线程中的对象!
一个使用排队连接来确保信号将从事件循环中传递,而不是像直接连接那样立即从emit站点传递。直接连接在概念上是一组对列表上的函数指针的调用。排队连接在概念上是发送给聪明接收者的事件,接收者可以根据事件内容执行函数调用。
事件是内部QMetaCallEvent
,QObject::event
作用于此事件并执行调用。