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

3

我有一个关于Qt处理信号和槽的基础问题。由于我对这个框架非常陌生,所以请原谅我如果听起来很愚蠢。我想知道如果我将某些信号连接到某些槽上。

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

在我的代码中,我调用了

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

Qt会保证将"abc"打印到屏幕上,也就是按顺序处理插槽吗?还是它将生成单独的线程来执行每个插槽?


Qt从不自动启动任何额外的线程,因此用户无需处理。Qt可能会在内部使用一些额外的线程(例如用于I/O的QProcess和QNetworkAccessManager),但它们永远不会暴露给API用户。一个没有显式多线程的单线程程序只有一个线程需要关注。 - Frank Osterfeld
2个回答

9

默认情况下:

1)如果发射信号的线程与接收对象具有关联,则连接到该信号的槽将立即执行,就像普通函数调用一样。在所有槽返回后,emit语句后面的代码将执行。

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

有关连接类型的更多信息,请参见此处:http://qt-project.org/doc/qt-4.8/threads-qobject.html#signals-and-slots-across-threads


1

补充一下Kotlomoy的正确答案:

您还可以通过提供可选参数ConnectionType来控制默认连接的类型:

connect(obj,signal,obj,slot,connectionType)

您的主要选项包括:

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

  • Qt :: DirectConnection:或者,您可以指定直接连接(甚至在线程之间),但通常您不需要或不想使用此选项,因为当在同一线程中从信号发射到插槽时,默认情况下会使用此选项。

如果使用QueuedConnection,则保证以该顺序将“abc”打印到屏幕上。

值得注意的是,如果在处理先前的插槽时发生了directConnect事件(例如,某些其他外部事件触发了类似IpSocket输入的信号),则会发生“中断”。在您的简单示例中不会发生这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接