我想知道QTimer一旦超时就会继续计数。
例如,假设我有一个每500ms超时的QTimer。假设当这个特定的QTimer超时时,我的程序恰好处于我所做的某些功能中(不在事件循环中),程序从我的函数到事件循环需要10ms。这是否意味着下次QTimer超时时间为1010ms?
如果是这种情况,有没有办法解决它?
感谢。
编辑:
答案 0 :(得分:2)
当您使用延迟d
的Qtimer时,它会在经过这段时间后触发timeout()
信号,并且只要处理了窗口系统事件队列中的所有事件。
因此,如果您的程序花费的时间不在事件循环中那么它就没问题了。无论如何,无论是否在Qt中,将超时设置为t ms
实际上意味着, 在至少t ms
已通过 时将其唤醒。你不能保证准确无误。
ps:如果你担心很少ms
,那么你应该担心时间粒度。
答案 1 :(得分:1)
我使用多个计时器进行了一些测试,但使用了timerEvent
(QObject::setTimer()
)。
当然,如果你有多个定时器在某个时刻发生干扰(准确地同时勾选),那么你的所有doStuffThatTake10ms
代码都将“排队”......但是定时器的绝对精度应该是随着时间的推移。这里有一些代码可以试试。
#ifndef MULTITIMER_H
#define MULTITIMER_H
#include <QObject>
#include <QTime>
class MultiTimer : public QObject
{
Q_OBJECT
public:
explicit MultiTimer(QObject *parent = 0);
void timerEvent(QTimerEvent *event);
private:
int timerId[4];
int interval[4];
int count[4];
QTime absoluteTimer;
};
#endif // MULTITIMER_H
实施.cpp
#include "MultiTimer.h"
#include <QTimerEvent>
#include <QTime>
#include <QDebug>
MultiTimer::MultiTimer(QObject *parent) :
QObject(parent)
{
interval[0] = 500;
interval[1] = 1000;
interval[2] = 1500;
interval[3] = 2000;
for( int i = 0; i < 4; i++)
timerId[i] = startTimer(interval[i]);
for( int i = 0; i < 4; i++)
count[i] = 0;
absoluteTimer.start();
}
void MultiTimer::timerEvent(QTimerEvent *event)
{
int id = -1;
for( int i = 0; i < 4; i++){
if( event->timerId() == timerId[i]){
id = i;
count[id]++;
break;
}
}
if( id != -1) {
qDebug() << "timer" << id
<< "interval" << interval[id]
<< "count" << count[id]
<< "total" << count[id]*interval[id]
<< "reference" << absoluteTimer.elapsed();
usleep(10000);
}
}
要试用它,请创建a = QApllication()
和MultiTimer
对象,然后点击a.exec()
。
linux上1分钟后的结果
timer 1 interval 1000 count 59 total 59000 reference 59010
timer 0 interval 500 count 119 total 59500 reference 59500
timer 0 interval 500 count 120 total 60000 reference 60000
timer 1 interval 1000 count 60 total 60000 reference 60010
timer 3 interval 2000 count 30 total 60000 reference 60021
timer 2 interval 1500 count 40 total 60000 reference 60031
timer 0 interval 500 count 121 total 60500 reference 60500
正如您所看到的timer 0
的第121个刻度正好在60500ms
...但在60000ms
所有计时器碰撞创建延迟执行。