我想知道QTimer在超时后是否会继续计数。QTimer在超时后是否继续计数?
例如,假设我有一个QTimer,每500ms超时。假设这个特定的QTimer超时,我的程序恰好在我所做的一些函数中(而不是在事件循环中),并且程序从我的函数获取到事件循环需要10ms。这是否意味着下一次QTimer超时会在1010ms?
如果是这样,是否有办法避开它?
谢谢。
编辑:
我想知道QTimer在超时后是否会继续计数。QTimer在超时后是否继续计数?
例如,假设我有一个QTimer,每500ms超时。假设这个特定的QTimer超时,我的程序恰好在我所做的一些函数中(而不是在事件循环中),并且程序从我的函数获取到事件循环需要10ms。这是否意味着下一次QTimer超时会在1010ms?
如果是这样,是否有办法避开它?
谢谢。
编辑:
我做了一些测试,使用多个定时器,但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()
。
结果
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
的121th蜱是正确的,在60500ms
时间......但60000ms
都定时器相撞产生延迟执行。
当你把一个Qtimer与延迟d
,将这段时间的流逝,一旦窗口系统的事件队列中的所有事件都被处理后火timeout()
信号。
因此,如果你的程序花费任何时间不在事件循环中,那么它很好。无论如何无论在Qt还是没有,设置超时时间为t ms
真的意味着,当我至少t ms
已经通过唤醒我。无论如何你都无法保证。
ps:如果您担心几个ms
那么您应该担心时间粒度。
嗨,谢谢你的回答。我的问题是,我有4个QTimers同时运行,不知何故,500毫秒计时器总是出现10毫秒左右。但问题是,它累计超过8秒。所以在两次超时之后,时间真的是〜1016ms,并且在很长一段时间内,这真的很糟糕。我不知道这是如何发生的。 – 2012-04-04 12:51:13
你在窗户上吗?如果你在不同的平台上运行你的程序,它会发生吗? – UmNyobe 2012-04-04 13:33:30
谢谢你的测试代码。我在我的电脑上运行了测试(Windows 7 x64),发现我的计时器结果确实在计时器上变得更糟。如果你看看我的编辑,你可以看到,仅仅看500毫秒,它会在晚些时候看到......在那里显示的最后一个,它从它开始的时间差不多200ms。我并不感到惊讶的是,Linux更准确地做到了这一点! P.S.要在Windows上运行它,我必须将睡眠(10)改为睡眠(10000)。我希望这不会弄乱任何东西。 – 2012-04-06 02:48:19