定时器QTimer和timerEvent事件重载的使用区别记录
- QTimer定时器
- QObject中的timerEvent事件重载-QObject定时器
- 总结
- 参考文章
QTimer定时器
一般情况下我们使用定时器开启定时任务都是这样操作:
public slots:
void Timer_func();
public:
QTimer* Timer_;
Timer_= new QTimer();
Timer_->setInterval(6000);
connect(Timer_, SIGNAL(timeout()), this, SLOT(Timer_func()));
Timer_->start();
这样做很明确,且是专门一个信号来触发定时任务,不会导致冲突。但是这需要每一个不同的定时任务对应开一个QTimer。有些对象内部轮询的任务,用QTimer定时就有点麻烦(懒),所以找到了另外一种方法,它就是QObject提供的定时器方法。
QObject中的timerEvent事件重载-QObject定时器
通常使用startTimer()要比QTimer有更好的使用效率,下面是官方文档原话翻译,节选自QObject class里的startTimer()
函数下方注解。
启动计时器并返回一个计时器标识符,如果不能启动计时器则返回零。
计时器事件将每隔毫秒发生一次,直到调用killTimer()。
如果标识符返回interval为0,则计时器事件在每次没有更多窗口系统事件需要处理时发生一次。
当计时器事件发生时,使用QTimerEvent事件参数类调用虚拟timerEvent()函数。
重载此函数以获取计时器事件。
如果有多个计时器在运行,QTimerEvent::timerId()可以用来找出哪个计时器被激活了。
所有继承自QObject的类,都会有一个timerEvent(QTimerEvent *event)
的纯虚函数,我们只需要继承QObject,然后再重载这个函数以实现自己的定时功能。
void timerEvent(QTimerEvent *event) override; 可以加override ,表示覆盖
.h文件内定义定时器ID:
.cpp 文件中重载timerEvent,使用startTimer(timerId)
开启定时器,使用killTimer(timerId)
关闭定时器。逻辑里通过验证timeID
实现不同功能:
Delay_MSec(INT msec)实现了QT中的非阻塞延时,非常好用,适合在对象内部自延时而不卡住其他事件(如界面事件)。
void MainWindow::Delay_MSec(unsigned int msec)
{
QTime _Timer = QTime::currentTime().addMSecs(msec);
while( QTime::currentTime() < _Timer )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
另外,timerEvent事件最好不要处理过久,因为如果这个事件函数被占用了,下一次的startTimer
定时器事件也会无法响应。这有点类似STM32中的中断函数,中断函数不允许处理时间过长,否则会导致中断阻塞,功能不稳定。
示例,大家也可以自己做测试:
图片文字里的32秒是错的 ,应该是33秒,小错误忽略掉就好~
总结
QTimer适用性相对较广,因为它的使用一般是基于信号与槽,所以可通过信号或槽的多级绑定以实现更为复杂的定时任务。且可以同一时间被触发多次。
timerEvent
事件则适用面相对较窄,因为实现它是继承和重载,这就意味着只有该类生成的对象能使用到这个定时事件,因为它们都在同一块内存空间中(同一个对象内),比如我A类重载了timerEvent
,A类内部有个B类,则我可以通过A类对象的timerEvent
来触发B类的定时操作。这非常适合在较少工作量的定时轮询场景中使用。但是timerEvent
不允许占用时间过长,否则事件触发被阻塞,导致功能不稳定。
提一嘴,QT 中,信号与槽是否是同一条线程要看connect函数的第五个参数。
直接连接是信号发出同时 立刻执行 槽函数,跟回调类似,是在同一条线程。执行完槽函数才会继续往下执行。
队列连接发出信号后,信号会放到接收方的事件队列 等待执行 ,并不是同一条线程,等接收方空闲事件循环才会调用槽函数。
自动连接 这是默认参数,让Qt自行选择。如果信号发送方和接收方在同一线程中,就使用直接连接;否则使用队列连接。
简单理解:把直连当成同步,信号发出立刻调用槽;队列当成异步,等接收方空闲下来才会处理。(如果实在需要立刻响应,就调用QCoreApplication::processEvents())
参考文章
参考文章- Qt中QTimer和timerevent的区别与用法
参考文章- QObject的timerEvent使用
参考文章- 关于Qt中常用的延时方法–自我总结
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)