QTimer线程亲和力

时间:2014-03-11 08:53:23

标签: qt

在文档中说:

  

在多线程应用程序中,您可以在任何线程中使用QTimer   有一个事件循环。要从非GUI线程启动事件循环,请使用   QThread::exec()。 Qt使用计时器的线程亲和力来确定   哪个线程将发出timeout()信号。因此,你   必须在其线程中启动和停止计时器;这是不可能的   从另一个线程启动一个计时器。

因此,当我有一个QTimer对象时,Qt使用对象(或它的父亲的)线程关联来确定哪个线程将发出timeout()信号。
但是当我使用不需要singleShot(..)实例的静态成员函数QTimer时会发生什么,哪个线程会发出超时信号呢?

2 个答案:

答案 0 :(得分:4)

Qt是开源的,因此最好的方法是检查source code。 因此创建了internal class QSingleShotTimer的对象(它是QObject但不是QTimer) 您提出的最重要的问题是here

  connect(this, SIGNAL(timeout()), receiver, member);

没有moveToThread所以它的工作原理如下:

  1. 为当前线程创建临时对象
  2. 从该线程发出信号
  3. 如果将目标对象分配给同一个线程,则立即调用该槽
  4. 否则,槽调用在目标所属的线程的事件循环中排队。
  5. 请参阅connect的文档及其5-th parameter (type of connection)的值。

    注意,如果msec值为零,则槽的调用在接收器所属的线程的偶数循环中排队(不创建临时对象)。

答案 1 :(得分:1)

QTimer::singleShot()函数创建一个QTimer对象,并在内部完成信号和清理的所有设置。

线程关联性将是执行该函数的正在运行的任何线程。