【发布时间】:2010-11-18 21:22:12
【问题描述】:
我不确定 Qt 4.5 中信号/槽机制的性质。发出信号时,是阻塞函数调用还是线程?这么说
emit GrabLatestData();
// proceed with latest data
在进行下一行之前是否会解决所有信号/槽链?
【问题讨论】:
我不确定 Qt 4.5 中信号/槽机制的性质。发出信号时,是阻塞函数调用还是线程?这么说
emit GrabLatestData();
// proceed with latest data
在进行下一行之前是否会解决所有信号/槽链?
【问题讨论】:
laalto 上面的回答是正确的。还有一点:如果你所有的 QObjects 都属于同一个线程并且你没有手动指定排队的连接,那么连接到信号的槽的执行是同步发生的——所有的处理都将在 'emit 之后的下一行之前完成' 陈述。由于这是最常见的情况,您的问题的答案通常是“是”。
signals and slots across multiple threads 上的文档可能对您有所帮助。
【讨论】:
这取决于。来自documentation:
当一个信号发出时,与其相连的槽通常会立即执行,就像一个普通的函数调用一样。发生这种情况时,信号和槽机制完全独立于任何 GUI 事件循环。在所有插槽都返回后,将执行
emit语句之后的代码。使用queued connections时情况略有不同;这种情况下,emit 关键字后面的代码会立即继续执行,slots 会稍后执行。
所以在正常情况下,它将是同步和阻塞的,而对于排队连接,它将是异步和非阻塞的。
【讨论】:
最大的问题是你不知道。也就是说,如果您从班级的角度来看。当你发出时,你不知道会发生什么:
如果有多个对象连接到信号,会变得更加难以知道会发生什么。在这种情况下,某些插槽可能已经运行,而其他插槽仍在排队。 顺便说一句,非阻塞连接不涉及线程。只有一个事件会在接收对象的线程的事件循环中发布。
【讨论】: