我想知道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