1. 问题描述
我们知道Qt中的定时器可以设置一个超时时间t1,定时器启动后(调用start()函数后),每到一个超时时间t1就会发送timeout()信号,再触发定时器处理函数,但是如果定时器处理函数t2大于了定时器的超时函数会怎么样呢?有以下两种可能
- 打断定时器处理函数,重新进入定时器处理函数
- 一直等待定时器处理函数,待其结束后,再进行下一次定时器处理函数
2. 问题验证
-
定义一个定时器及对应的处理函数
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTimer> class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); public slots: void onTimer(); private: QTimer* m_timer; }; #endif // WIDGET_H
-
槽函数配置
定时器的超时时间设置为1000ms,槽函数里面延时了10s
widget.cpp
#include "widget.h" #include <QThread> #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent) { m_timer=new QTimer(this); m_timer->start(1000); connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimer())); } Widget::~Widget() { } void Widget::onTimer() { static int count=1; qDebug()<<"count:"<<count++; for(int i=0;i<10;++i) { QThread::msleep(1000); qDebug()<<"onTimer "<<i<<"s "<< " processed"; } }
main.cpp
#include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
-
执行结果
count: 1 onTimer 0 s processed onTimer 1 s processed onTimer 2 s processed onTimer 3 s processed onTimer 4 s processed onTimer 5 s processed onTimer 6 s processed onTimer 7 s processed onTimer 8 s processed onTimer 9 s processed count: 2 onTimer 0 s processed onTimer 1 s processed onTimer 2 s processed onTimer 3 s processed onTimer 4 s processed onTimer 5 s processed onTimer 6 s processed onTimer 7 s processed onTimer 8 s processed onTimer 9 s processed count: 3 onTimer 0 s processed onTimer 1 s processed onTimer 2 s processed onTimer 3 s processed onTimer 4 s processed onTimer 5 s processed onTimer 6 s processed onTimer 7 s processed onTimer 8 s processed onTimer 9 s processed
可以发现30s的时间定时器处理函数执行了三次
3. 结论
如果定时器处理函数大于定时器的超时时间,则定时器触发需等待定时器处理函数执行完毕。