我对这个主题做了一些研究。 SO的thread也引起了我的兴趣,我想总结一下我的理解,如果我在某条路上出错,并且想知道QueuedConnection如何工作,我会更正。
以下是我对此问题的理解。 信号可以主要通过两种不同方式手动连接到插槽,第一种方式是使用直接连接,第二种方式是排队连接。在直接连接的情况下,如果连接到信号的插槽方法在同一个线程中,则顺序调用slot方法(就好像它只是另一种方法)但是插槽位于与信号不同的线程中然后启动QueuedConnection会在找到它时启动它。 (现在在这种情况下,我不确定它是否会启动新线程或者如何继续这样做)
答案 0 :(得分:7)
插槽不属于任何特定线程,因为它们只是普通的功能。但对象呢。如果通过QueuedConnection
将信号连接到插槽,信号发射将创建一个事件并将其发送到目标的事件队列中。 Qt将安排在内部处理该事件时调用您的插槽。
对于所有事件,它们在对象的线程关联的线程中处理。您可以通过调用目标对象上的moveToThread
来更改该线程。
答案 1 :(得分:1)
在发送方和recievr对象处于不同线程的多线程环境中。
Qt的:: QueuedConnection
Qt的:: BlockingQueuedConnection
答案 2 :(得分:0)
粗略地说,对于QueuedConnection,Qt将为插槽所属的线程创建一个接收信号的队列,并将逐个启动它们,以便在线程可用时将它们存储在队列中(它完成了它的任何内容)做并返回事件循环)。
不会启动新线程 - slot属于某个线程,因此将在该线程中执行。