Qt排队连接中的插槽调用顺序

时间:2014-04-28 04:50:25

标签: c++ multithreading qt qthread qt-signals

考虑我们有两个线程:Thread1和Thread2。

Thread1有两个信号:signal1()和signal2()

Thread2有两个插槽:slot1()和slot2()

当我们连接这些信号和插槽时:

connect(Thread1,SIGNAL(signal1()),Thread2,SLOT(slot1()));
connect(Thread1,SIGNAL(signal2()),Thread2,SLOT(slot2()));

然后在Thread1中的某个地方一个接一个地发出信号,如:

emit signal1();
emit signal2();

由于它们位于不同的排队连接中,slot1()是否必须在slot2()之前调用?

2 个答案:

答案 0 :(得分:2)

您的问题没有明确定义。你的意思是Thread1 / Thread2的QThread对象吗?

在这种情况下,如果连接是Queued并且两个对象具有不同的线程亲和性,那么当发出信号时,它将被包装在一个事件中并放置在SLOT对象的事件队列中(在本例中为Thread2)。然后按照它们到达的顺序依次处理这些事件(相应的插槽执行)。所以是的,slot2()将在slot1()之后执行。

答案 1 :(得分:2)

插槽按今天的相应信号的发射顺序执行。

后台发生的事情是排队连接将一个事件放入队列并将被处理。这个队列基本上是一个FIFO(先进先出),因为它目前正在实施。

如果您想自己查看实施,可以在这里找到一些细节:

void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority)

class QPostEventList : public QVector

然而,我个人建议不要依赖这种内部行为,因为它没有记录,因此,它可能会在没有任何通知的情况下进行进一步的更改。

因此,在我看来,如果你需要以某种方式依赖对方,那么未来更有效的方法是在你的软件中进行显式的依赖管理。这通常不是问题,甚至使代码更加明确,因此更全面。