5

我正在研究我正在研究的一些源代码。我发现有人编码的一个特殊语句。源代码是一个带有 QML GUI 并使用 QT 4.7.x 的 GUI 应用程序。

下面的代码片段属于核心应用程序逻辑。

// connect signal-slots for decoupling
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this, 
    SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection);

奇怪的是对象通过队列连接连接到自身,这本质上意味着对象可能同时“生活”在不同的线程中?

乍一看,这对我没有任何意义。谁能想到为什么这种联系是合理的或需要的?这甚至会起作用吗?

4

2 回答 2

10

它将毫无问题地工作。在调用 SetCurrentTaskSlot 之前可能需要进行一些事件循环处理?

请注意,QueuedConnection 并不意味着某些东西在不同的线程中。QueuedConnection 仅表示在发出信号时,不会直接调用相应的插槽。它将在事件循环中排队,并在将控制权交还给事件循环时进行处理

于 2012-06-27T15:52:33.397 回答
3

排队的连接并不意味着接收者住在哪里。反之亦然:为了安全地向另一个线程中的对象发送信号,您必须使用排队连接。但是您可以将它们用于生活在任何线程中的对象!

一种是使用排队连接来确保信号将从事件循环内传递,而不是像直接连接那样立即从发射站点传递。直接连接在概念上是一组对列表中函数指针的调用。排队连接在概念上是一个发送给聪明接收者的事件,接收者可以根据事件的内容执行函数调用。

事件是 internal QMetaCallEvent,它QObject::event作用于这个事件并执行调用。

于 2012-06-27T17:39:01.277 回答