首页 > 代码库 > 为何只能在其关联的线程内启动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会检查一致性,否则就不执行)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。