首页 > 代码库 > 为何只能在其关联的线程内启动timer?(Qt会检查一致性,否则就不执行)

为何只能在其关联的线程内启动timer?(Qt会检查一致性,否则就不执行)

为何只能在其关联的线程内启动timer?

在QTimer源码分析(以Windows下实现为例) 一文中,我们谈到:

QTimer的是通过QObject的timerEvent()实现的,开启和关闭定时器是通过QObject的startTimer()和killTimer完成的。

startTimer最终调用对象关联线程的eventDispatcher来注册定时器:

int QObject::startTimer(int interval){    Q_D(QObject);    return d->threadData->eventDispatcher->registerTimer(interval, this);

在Win32平台下:

void QEventDispatcherWin32::registerTimer(int timerId, int interval, QObject *object){    if (timerId < 1 || interval < 0 || !object) {        qWarning("QEventDispatcherWin32::registerTimer: invalid arguments");        return;    } else if (object->thread() != thread() || thread() != QThread::currentThread()) {        qWarning("QObject::startTimer: timers cannot be started from another thread");        return;    }...

在Linux平台下:

void QEventDispatcherGlib::registerTimer(int timerId, int interval, QObject *object){#ifndef QT_NO_DEBUG    if (timerId < 1 || interval < 0 || !object) {        qWarning("QEventDispatcherGlib::registerTimer: invalid arguments");        return;    } else if (object->thread() != thread() || thread() != QThread::currentThread()) {        qWarning("QObject::startTimer: timers cannot be started from another thread");        return;    }...

在这两个平台下,它都会检查当前线程和dispatcher的线程是否一致。不一致则直接返回。

为什么要这么设计。我不太清楚。或许是因为:注册定时器要用到回调函数,而回调函数需要在注册的线程执行(fix me)。

 

http://blog.csdn.net/lynfam/article/details/7081545

为何只能在其关联的线程内启动timer?(Qt会检查一致性,否则就不执行)