여러 타이머를 사용하여 테스트했지만 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()
.
결과 리눅스 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
모든 타이머가 지연 실행을 만드는 충돌 볼 수 있듯이.
테스트 코드를 제공해 주셔서 감사합니다. 내 컴퓨터 (Windows 7 x64)에서 테스트를 실행하고 내 타이머 결과가 실제로 타이머보다 악화되는 것을 발견했습니다. 내 편집 내용을 살펴보면 500ms 만 보시면 나중에 읽고 나중에 볼 수 있습니다 ... 마지막으로 표시된 부분은 처음 시작했을 때부터 약 200ms입니다.나는 리눅스가 훨씬 더 정확하게 그것을하는 것은 놀라운 일이 아니다! P. Windows에서 실행하려면 휴면 (10)으로 휴면 (10000)을 변경해야했습니다. 나는 이것이 아무것도 엉망이되지 않았 으면 좋겠다. –