Qt的4.5 - 正在发射信号的功能调用,或者一个线程,并执行它阻止?(Qt 4.5 - Is e

2019-08-01 00:46发布

我不知道的信号/槽机制的使用Qt 4.5的本质。 当一个信号被发射时,它是一个阻塞函数调用或线程? 说这个

emit GrabLatestData();

// proceed with latest data

将所有的信号/槽链进行下一行之前得到解决?

Answer 1:

这取决于。 从文档 :

当一个信号被发射时,与它相连的槽通常是立即执行的,就像普通的函数调用。 当发生这种情况时,信号和槽机制是完全独立于任何GUI事件循环。 下面的代码的执行emit声明,一旦所有插槽返回会发生。 这种情况是当使用稍微不同的排队的连接 ; 在这样的情况下,继发射关键字代码将立即继续,和槽将在后面执行。

所以在正常情况下,这将是同步和阻断,并用排队连接这将是异步的,非阻塞的。



Answer 2:

最大的问题是,你只是不知道。 也就是说,如果你从类的角度看。 当你发射,你不知道会发生什么:

  • 如果没有一个连接到信号,没有任何反应
  • 如果在同一个线程有人在使用任何类型的Qt的除外:: QueuedConnection连接,呼叫将被阻止
  • 如果在同一个线程有人使用Qt :: QueuedConnection连接,通话将非阻塞
  • 如果从不同的线程有人使用Qt :: DirectConnection连接(当你这样做很小心!)或Qt的:: BlockingQueuedConnection,呼叫将被阻止
  • 如果从不同的线程有人使用Qt ::自动连接或Qt的:: QueuedConnection连接,通话将非阻塞

它变得更加难以知道,如果多个对象连接到信号会发生什么。 在这种情况下,而另一些仍在排队,有些插槽可能已经运行。 还有就是,顺便说一下,没有线程参与无阻塞连接。 只是有这么被张贴在接收对象的线程的事件循环的事件。



Answer 3:

上述laalto的答案是正确的。 另一点是:如果所有的QObject的属于同一个线程,你有没有手动指定排队的连接,然后连接到信号时隙同步执行发生 - 所有处理都将在下一行之前之后进行的“EMIT “声明。 因为这是最常见的情况,回答你的问题,通常是“是”。

在该文档在多个线程的信号和槽可能会对你有所帮助。



文章来源: Qt 4.5 - Is emitting signal a function call, or a thread, and does it blocks?
标签: qt qt4