2012-04-04 26 views
3

我想知道QTimer在超时后是否会继续计数。QTimer在超时后是否继续计数?

例如,假设我有一个QTimer,每500ms超时。假设这个特定的QTimer超时,我的程序恰好在我所做的一些函数中(而不是在事件循环中),并且程序从我的函数获取到事件循环需要10ms。这是否意味着下一次QTimer超时会在1010ms?

如果是这样,是否有办法避开它?

谢谢。

编辑: Timer results

回答

1

我做了一些测试,使用多个定时器,但timerEventQObject::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的121th蜱是正确的,在60500ms时间......但60000ms都定时器相撞产生延迟执行。

+0

谢谢你的测试代码。我在我的电脑上运行了测试(Windows 7 x64),发现我的计时器结果确实在计时器上变得更糟。如果你看看我的编辑,你可以看到,仅仅看500毫秒,它会在晚些时候看到......在那里显示的最后一个,它从它开始的时间差不多200ms。我并不感到惊讶的是,Linux更准确地做到了这一点! P.S.要在Windows上运行它,我必须将睡眠(10)改为睡眠(10000)。我希望这不会弄乱任何东西。 – 2012-04-06 02:48:19

2

当你把一个Qtimer与延迟d,将这段时间的流逝,一旦窗口系统的事件队列中的所有事件都被处理后火timeout()信号。

因此,如果你的程序花费任何时间不在事件循环中,那么它很好。无论如何无论在Qt还是没有,设置超时时间为t ms真的意味着,当我至少t ms已经通过唤醒我。无论如何你都无法保证。

ps:如果您担心几个ms那么您应该担心时间粒度。

+0

嗨,谢谢你的回答。我的问题是,我有4个QTimers同时运行,不知何故,500毫秒计时器总是出现10毫秒左右。但问题是,它累计超过8秒。所以在两次超时之后,时间真的是〜1016ms,并且在很长一段时间内,这真的很糟糕。我不知道这是如何发生的。 – 2012-04-04 12:51:13

+0

你在窗户上吗?如果你在不同的平台上运行你的程序,它会发生吗? – UmNyobe 2012-04-04 13:33:30