Qt信号发射和QThread执行流程
Qt signal emission and QThread execution flow
这是QtThreads and QObjects doc的一部分
Direct Connection The slot is invoked immediately, when the signal is
emitted. The slot is executed in the emitter's thread, which is not
necessarily the receiver's thread.
所以让我们承认我陷入了
while (this->true_bool);
在线程1中,线程2发出一个信号,连接到上一行"this"对象的一个槽,是在循环退出后执行(所以永远不会)还是立即执行在插槽 returns 之后,它返回到 while(所以如果我将 this->true_bool 更改为 false 它将结束循环)?
我觉得这会导致立即调用插槽,但文档似乎是这么说的。
会在线程2中立即执行,独立于线程1中的循环。
...The slot is executed in the emitter's thread, which is not
necessarily the receiver's thread...
编辑: 我认为这个关于 QThread 的答案对你有用:
Qt 调用工作如下:
- 直接连接。只要有直接连接,emit 调用就会执行以下操作:枚举所有连接的插槽并逐个调用它们。插槽是函数,它们会在 emit 调用期间立即被调用。因此,一旦
emit Something()
完成,所有直接连接到它的插槽都会被执行。把它想象成一个函数指针数组,在调用过程中一个一个地执行。所以所有的槽都在你调用信号的同一个线程上执行。
- 排队连接。它类似于直接连接,但不是直接调用每个插槽,而是将其发布到与每个插槽关联的对象的队列中。因此,插槽由目标对象关联的事件循环执行。因此它由目标对象所在的线程执行,而不是调用信号的线程(以防目标对象的线程和信号调用的线程不同)。因此,当信号调用完成时,这意味着所有排队的连接
QEvents
都已发布到适当的队列,但这并不意味着插槽已执行。
这是QtThreads and QObjects doc的一部分
Direct Connection The slot is invoked immediately, when the signal is emitted. The slot is executed in the emitter's thread, which is not necessarily the receiver's thread.
所以让我们承认我陷入了
while (this->true_bool);
在线程1中,线程2发出一个信号,连接到上一行"this"对象的一个槽,是在循环退出后执行(所以永远不会)还是立即执行在插槽 returns 之后,它返回到 while(所以如果我将 this->true_bool 更改为 false 它将结束循环)?
我觉得这会导致立即调用插槽,但文档似乎是这么说的。
会在线程2中立即执行,独立于线程1中的循环。
...The slot is executed in the emitter's thread, which is not necessarily the receiver's thread...
编辑: 我认为这个关于 QThread 的答案对你有用:
Qt 调用工作如下:
- 直接连接。只要有直接连接,emit 调用就会执行以下操作:枚举所有连接的插槽并逐个调用它们。插槽是函数,它们会在 emit 调用期间立即被调用。因此,一旦
emit Something()
完成,所有直接连接到它的插槽都会被执行。把它想象成一个函数指针数组,在调用过程中一个一个地执行。所以所有的槽都在你调用信号的同一个线程上执行。 - 排队连接。它类似于直接连接,但不是直接调用每个插槽,而是将其发布到与每个插槽关联的对象的队列中。因此,插槽由目标对象关联的事件循环执行。因此它由目标对象所在的线程执行,而不是调用信号的线程(以防目标对象的线程和信号调用的线程不同)。因此,当信号调用完成时,这意味着所有排队的连接
QEvents
都已发布到适当的队列,但这并不意味着插槽已执行。