考虑我们有两个线程: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()之前调用?
答案 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
然而,我个人建议不要依赖这种内部行为,因为它没有记录,因此,它可能会在没有任何通知的情况下进行进一步的更改。
因此,在我看来,如果你需要以某种方式依赖对方,那么未来更有效的方法是在你的软件中进行显式的依赖管理。这通常不是问题,甚至使代码更加明确,因此更全面。