Qt中的信号槽执行是否并行化?

时间:2013-06-08 22:28:28

标签: multithreading qt signals-slots

我对处理信号和插槽的方式有一个基本的Qt问题。我对框架很新,所以请原谅我,如果这听起来很愚蠢。我想知道我是否有某些信号连接到某些插槽。

signal1() ---> slot1(){ cout <<"a"; }
signal2() ---> slot2(){ cout <<"b"; }
signal3() ---> slot3(){ cout <<"c"; }

在我的代码中,我打电话给

emit signal1();
emit signal2();
emit signal3();

Qt是否保证将“abc”打印到屏幕上,换句话说,顺序处理插槽?或者它会产生一个单独的线程来执行每个插槽? 谢谢!

2 个答案:

答案 0 :(得分:8)

默认情况下:

1)如果在接收对象具有亲和力的线程中发出信号,则立即执行连接到该信号的槽,就像正常的函数调用一样。所有插槽返回后,将在emit语句后执行代码。

2)否则,当控制返回到接收者线程的事件循环时,将调用该槽。 emit关键字后面的代码将立即继续,并且稍后将在接收者的线程中执行这些插槽。

有关此处连接类型的详细信息:http://qt-project.org/doc/qt-4.8/threads-qobject.html#signals-and-slots-across-threads

答案 1 :(得分:1)

只是添加到Kotlomoy的正确答案:)

您还可以通过提供可选参数ConnectionType来控制默认连接的类型: connect(obj,signal,obj,slot,connectionType)

您的主要选项是:

  • Qt :: QueuedConnection:仅当控制返回到线程的事件循环时才会运行。即将被添加到队列中。如果您不希望立即处理您的插槽,请指定此项,这可能非常有用。

  • Qt :: DirectConnection:或者您可以指定直接连接(如果需要,甚至可以在线程之间),但通常您不需要或不想使用此选项,因为当信号发送到插槽时它是默认的在同一个主题中。

如果您使用QueuedConnection,则可以按照该顺序将“abc”打印到屏幕上。

值得注意的是,如果在处理前一个插槽时发生了directConnect事件(假设某个其他外部事件触发了像IpSocket输入这样的信号),那么您将被“中断”。这不会发生在你的简单例子中。