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

时间:2013-08-15 20:35:55

标签: c++ qt signals-slots

我对这个主题做了一些研究。 SO的thread也引起了我的兴趣,我想总结一下我的理解,如果我在某条路上出错,并且想知道QueuedConnection如何工作,我会更正。

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

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

在发送方和recievr对象处于不同线程的多线程环境中。

  

Qt的:: QueuedConnection

  • 发出线程时发生了什么?它只是发出(内部 postevent,to reciever threads message queue)和恢复发射器 线程(不阻止)。
  • 执行上述内容后,接收线程上发生了什么 声明?当控制返回到事件循环时,将调用该槽 接收者的线程。
  

Qt的:: BlockingQueuedConnection

  • 发出线程时发生了什么?它发出(内部sendEvent, 收到消息队列)和阻止发射器线程直到接收器 插槽返回。(阻挡)。
  • 收件人帖子上发生了什么?控件时调用插槽 返回接收者线程的事件循环。

答案 2 :(得分:0)

粗略地说,对于QueuedConnection,Qt将为插槽所属的线程创建一个接收信号的队列,并将逐个启动它们,以便在线程可用时将它们存储在队列中(它完成了它的任何内容)做并返回事件循环)。

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