Qt 插槽是否与其他代码并行运行?

J B*_*J B 3 c++ qt

在这个函数示例中:

void MyClass::myFunction()
  {
    emit MySignal1();
    emit MySignal2();
  }
Run Code Online (Sandbox Code Playgroud)

如果我slot1听过MySignal1,并且slot2听过MySignal2

1)slot1会一直被执行slot2吗?

2) 一个时隙会一直执行到另一个时隙完成吗?或者两个插槽可以并行运行吗?

Joh*_*itb 5

答案完全取决于信号如何连接到它们各自的插槽:假设两个信号都连接到同一个对象的插槽,那么:调用总是有序的(假设你没有做一些奇怪的事情......但是你会已经知道......就像你过滤掉QEvent::MetaCall事件......这绝对是不推荐的)。

如果它们与 连接Qt::QueuedConnection,则发射总是立即返回并且不等待调用完成。

您可以使用Qt::BlockingQueuedConnection, 然后排放等待调用返回(这只能在目标对象与当前运行的线程位于不同的线程中并且目标对象的线程具有正在运行的事件循环时使用 - 否则会发生死锁! )。

对于 a Qt::DirectConnection,两个排放都将成为简单的函数调用,因此对于这种情况,顺序很简单。


如果您有不同的 objects,那么如果您使用Qt::DirectConnection,您仍然有顺序执行。

否则,对于Qt::QueuedConnectionorQt::BlockingQueuedConnection和目标对象存在于同一线程中,同样的事情适用于相同对象的情况。如果它们位于不同的线程中,对于非阻塞排队连接,您没有顺序保证......插槽可能并发执行。对于阻塞排队连接,您再次订购了执行。