在文档中说:
在多线程应用程序中,您可以在任何线程中使用
QTimer
有一个事件循环。要从非GUI线程启动事件循环,请使用QThread::exec()
。 Qt使用计时器的线程亲和力来确定 哪个线程将发出timeout()
信号。因此,你 必须在其线程中启动和停止计时器;这是不可能的 从另一个线程启动一个计时器。
因此,当我有一个QTimer
对象时,Qt使用对象(或它的父亲的)线程关联来确定哪个线程将发出timeout()
信号。
但是当我使用不需要singleShot(..)
实例的静态成员函数QTimer
时会发生什么,哪个线程会发出超时信号呢?
答案 0 :(得分:4)
Qt是开源的,因此最好的方法是检查source code。
因此创建了internal class QSingleShotTimer的对象(它是QObject
但不是QTimer
)
您提出的最重要的问题是here:
connect(this, SIGNAL(timeout()), receiver, member);
没有moveToThread
所以它的工作原理如下:
请参阅connect的文档及其5-th parameter (type of connection)的值。
注意,如果msec
值为零,则槽的调用在接收器所属的线程的偶数循环中排队(不创建临时对象)。
答案 1 :(得分:1)
QTimer::singleShot()
函数创建一个QTimer对象,并在内部完成信号和清理的所有设置。
线程关联性将是执行该函数的正在运行的任何线程。