编辑
2025-03-03
工作知识
0
请注意,本文编写于 95 天前,最后修改于 95 天前,其中某些信息可能已经过时。

目录

一、使用惯例
1.1 使用QTimer实例实现可重复定时器
1.2 使用QTimer::singleShot实现一次性定时器
二、QTimer注意事项
2.1 只能在QTimer所属线程中启动(thread() == QThread::currentThread())
2.2 在启动时QTimer所属线程必须具备事件循环(d->threadData->hasEventDispatcher())
2.3 QTimer所属线程进入事件循环后才能触发超时信号。
三、 QTimer基本原理
四、QTimer实现源码

一、使用惯例

1.1 使用QTimer实例实现可重复定时器

#include <QTimer> #include <QCoreApplication> #include <QDebug> int main(int argc, char** argv) { QCoreApplication app(argc, argv); //创建事件循环,用于分发QTimerEvent超时事件 auto timer = new QTimer; //新建定时器 //以QT信号-槽方式设置超时回调函数,这里槽的为lambda函数 QObject::connect(timer, &QTimer::timeout, [timer] () { static int cnt = 0; //定时器重复次数 cnt++; qDebug() << "当前定时器超时/重复时间(豪秒):" << timer->interval(); if(cnt > 4) timer->stop(); //停止计时器 }); timer->start(1000); //启动定时器,超时时间1000毫秒 return app.exec(); //进入事件循环,分发处理超时事件 }

1.2 使用QTimer::singleShot实现一次性定时器

#include <QTimer> #include <QCoreApplication> #include <QDebug> int main(int argc, char** argv) { QCoreApplication app(argc, argv); //创建事件循环 //创建一次性定时器,超时时间2000毫秒,并指定超时回调函数(lambda匿名函数) QTimer::singleShot(2000, [](){ qDebug() << "SingleTimer timeout!!"; }); app.exec(); //进入事件循环 return 0; }

二、QTimer注意事项

2.1 只能在QTimer所属线程中启动(thread() == QThread::currentThread())

2.2 在启动时QTimer所属线程必须具备事件循环(d->threadData->hasEventDispatcher())

主线程:在构建QCoreApplication对象之后

副线程:执行QThread::start完并进入run函数之后(此时线程才真正创建完成)

2.3 QTimer所属线程进入事件循环后才能触发超时信号。

主线程:执行QCoreApplication::exec

副线程:执行QThread::exec

三、 QTimer基本原理

借助QTimerEvent事件实现,当启动(QTimer::start)一个定时器时Qt调用底层操作系统接口注册一个定时器给当前线程,当线程接收到超时信号时会构造一个QTimerEvent事件发送会给QTimer对象,QTimer接收到该事件后会调用QObject::timerEvent函数,QTimer类通过覆盖(override)该虚函数,触发QTimer::timeout信号。

四、QTimer实现源码

https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qtimer.cpp.html