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
,因此其工作原理如下:

  • 为当前线程创建临时对象
  • 信号从该线程发出
  • 如果目标对象被分配给同一个线程,则立即调用插槽
  • 否则,插槽调用将在目标所属线程的事件循环中排队
  • 请参阅its的文档和值


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

    你错了,看看我的答案
    QTimer
    没有被创建,但是内部类的某个对象
    QSingleShotTimer
    ;我还没有生成一个最小的完整示例(因此不值得开始一个新问题),但我猜它与线程亲和力有关。所以我想知道,在我的Qt版本中(我认为它是5.6.2-1),
    singleShot
    计时器在错误的线程中启动,是否真的无法触发回调。我打赌你是在调用线程中的
    singleShot
    ,而线程不会将控制返回到事件循环。需要事件循环处理,以便
    QTimer
    可以工作。
      connect(this, SIGNAL(timeout()), receiver, member);