QTimer线程亲和力
文件中说: 在多线程应用程序中,您可以在以下任何线程中使用QTimer线程亲和力,qt,Qt,文件中说: 在多线程应用程序中,您可以在以下任何线程中使用QTimer 有一个事件循环。要从非GUI线程启动事件循环,请使用 QThread::exec()。Qt使用计时器的线程关联来确定 哪个线程将发出timeout()信号。因为这个,你 必须在其线程中启动和停止计时器;这是不可能的 从另一个线程启动计时器 因此,当我有一个QTimer对象时,Qt使用该对象(或其父对象)的线程关联来确定哪个线程将发出timeout()信号。 但是当我使用静态成员函数singleShot(…)时会发生什么呢?它
QTimer
有一个事件循环。要从非GUI线程启动事件循环,请使用
QThread::exec()
。Qt使用计时器的线程关联来确定
哪个线程将发出timeout()
信号。因为这个,你
必须在其线程中启动和停止计时器;这是不可能的
从另一个线程启动计时器
因此,当我有一个QTimer
对象时,Qt使用该对象(或其父对象)的线程关联来确定哪个线程将发出timeout()
信号。但是当我使用静态成员函数
singleShot(…)
时会发生什么呢?它不需要QTimer
实例,那么哪个线程将发出超时信号?函数创建一个QTimer对象,并在内部执行所有信号设置和清理
线程关联将是运行执行该函数的线程。Qt是开源的,所以最好的方法是检查。 因此创建了的对象(它是
QObject
,但不是QTimer
)。回答您问题的最重要的一句话是: 没有
moveToThread
,因此其工作原理如下:
请注意,如果
msec
值为零,则插槽调用将在接收器所属线程的偶数循环中排队(不创建临时对象) 你错了,看看我的答案QTimer
没有被创建,但是内部类的某个对象QSingleShotTimer
;我还没有生成一个最小的完整示例(因此不值得开始一个新问题),但我猜它与线程亲和力有关。所以我想知道,在我的Qt版本中(我认为它是5.6.2-1),singleShot
计时器在错误的线程中启动,是否真的无法触发回调。我打赌你是在调用线程中的singleShot
,而线程不会将控制返回到事件循环。需要事件循环处理,以便QTimer
可以工作。
connect(this, SIGNAL(timeout()), receiver, member);