C++ QT是在单独线程中启动的插槽

C++ QT是在单独线程中启动的插槽,c++,qt,signals-slots,C++,Qt,Signals Slots,我在这个问题上做了一些研究。at SO也引起了我的兴趣,我想总结一下我的理解,如果我在某条路径上出错,我想得到纠正,还想知道QueuedConnection将如何工作 以下是我的理解,然后是问题。 信号可以通过两种不同的方式手动连接到插槽,第一种方式是使用直接连接,第二种方式是排队连接。在直接连接的情况下,如果附加到信号的slot方法位于同一线程中,则按顺序调用slot方法(就像它只是另一个方法一样),但是如果slot位于与信号启动位置不同的线程中,则QueuedConnection将在其认为合

我在这个问题上做了一些研究。at SO也引起了我的兴趣,我想总结一下我的理解,如果我在某条路径上出错,我想得到纠正,还想知道QueuedConnection将如何工作

以下是我的理解,然后是问题。
信号可以通过两种不同的方式手动连接到插槽,第一种方式是使用直接连接,第二种方式是排队连接。在直接连接的情况下,如果附加到信号的slot方法位于同一线程中,则按顺序调用slot方法(就像它只是另一个方法一样),但是如果slot位于与信号启动位置不同的线程中,则QueuedConnection将在其认为合适时启动它。(现在,在这种情况下,我不确定它是否会启动一个新线程,或者它将如何继续执行此操作)

粗略地说,因为QueuedConnection Qt将为插槽所属的线程创建一个接收信号队列,并在线程可用时逐个启动这些信号,以便它们存储在队列中(它完成正在执行的任何操作并返回事件循环)


不会启动新线程-插槽属于某个线程,因此将在该线程中执行。

插槽不属于任何特定线程,因为它们只是普通函数。但对象属于。如果通过
队列连接将信号连接到插槽,则信号发射将创建一个事件并将其发送到偶数Qt的t队列将安排在内部处理该事件时调用您的插槽


对于所有事件,它们都在对象线程关联的线程中处理。您可以通过在目标对象上调用
moveToThread
来更改该线程。

在多线程环境中,当发送方和接收方对象在不同的线程中。

Qt::QueuedConnection

  • 发出线程时会发生什么?它只是发出(内部 postevent,到接收方线程(消息队列)和恢复发送器 线程(未阻塞)
  • 在执行上述命令后,Receiver线程上发生了什么 语句?当控件返回到事件循环时调用插槽 接受者的线
Qt::BlockingQueuedConnection

  • 发射线程上发生了什么?它发射(内部sendEvent, 接收消息队列)和阻止发送器线程直到接收器 插槽返回(阻塞)
  • receiever线程上发生了什么?当控件 返回到接收方线程的事件循环

感谢您的解释。您能解释一下对象线程关联性是什么意思吗?一般来说,对象的线程关联性只是其方法将在其中运行的线程(通过对象的事件分派调用时)。例如,如果调用
myObject.moveToThread(myThread)
然后,通过信号/插槽在该对象上调用的任何方法都将在
myThread
中执行,而不是在生成事件的线程中执行。这样,信号/插槽可用于让对象跨“线程边界”相互通知事件-我在这里避免使用“事件”一词,因为它可能会与Qt的事件系统混淆,信号/插槽与之无关。@Frankosterfield,这不是真的。插槽是通过发送
QEvent::MetaCall
事件来调用的。对,这确实适用于排队连接(因此也适用于多线程信号/插槽)。