2012-04-04 2 views
3

QTimer가 시간 초과되면 카운팅을 계속할 것인지 알고 싶습니다.QTimer는 타임 아웃이 끝나면 계속 계산합니까?

예를 들어, 내가 500ms마다 타임 아웃하는 QTimer를 가지고 있다고 가정 해 봅시다. 이 특정 QTimer가 시간 제한을 초과하면 내 프로그램이 이벤트 루프가 아닌 일부 기능을 수행하고 프로그램이 내 기능에서 이벤트 루프로 이동하는 데 10ms가 걸린다 고 가정 해 보겠습니다. 그 다음에 QTimer 시간 초과가 1010ms가 될 것을 의미합니까?

이 경우 주위를 둘러 볼 방법이 있습니까?

감사합니다.

편집 : 당신이 지연 d와 Qtimer을 넣을 때이 기간이 바로 윈도우 시스템의 이벤트 큐에있는 모든 이벤트가 처리로 경과 후 Timer results

답변

1

여러 타이머를 사용하여 테스트했지만 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 모든 타이머가 지연 실행을 만드는 충돌 볼 수 있듯이.

+0

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

2

는, 그것이 timeout() 신호를 발사합니다 .

그래서 프로그램이 이벤트 루프에없는 시간을 보낸다면 괜찮습니다. 어쨌든 Qt 여부에 관계없이 t ms으로 시간 제한을 설정하면 은 적어도 t ms이 넘었을 때 깨어납니다.입니다. 당신은 정확성을 보장 할 수 없습니다.

ps : ms이 적다는 것이 걱정된다면 타이밍 세분성에 대해 걱정해야합니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. 내 문제는, 내가 한 번에 4 QTimers를 실행하고, 어떻게 든, 500ms 타이머는 항상 약 10ms 밖입니다. 그러나 문제는 누적 적으로 ~ 8 초가 지나갔습니다. 그래서 두 번의 타임 아웃이 끝나면, 시간은 실제로 ~ 1016ms이고 오랜 기간 동안, 이것은 정말로 나쁩니다. 어떻게 이런 일이 일어날 지 모르겠다. –

+0

창문에 있습니까? 다른 플랫폼에서 프로그램을 실행하면 어떻게됩니까? – UmNyobe

관련 문제