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

Raj*_*war 0 c++ qt signals-slots

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

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

Joh*_*itb 7

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

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

  • 一般来说,对象的线程亲和性只是其方法运行的线程(当通过对象的事件调度调用时).例如,如果你调用`myObject.moveToThread(myThread)`,那么通过signals/slots*调用该对象*的任何方法都将在`myThread`中执行,而不是在生成事件的线程中执行.通过这种方式,可以使用信号/槽来让对象跨越"线程边界"相互通知事物. (2认同)