2012-04-04 346 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