QTimer一旦超时就会继续计算吗?

时间:2012-04-04 11:30:26

标签: qt qt4

我想知道QTimer一旦超时就会继续计数。

例如,假设我有一个每500ms超时的QTimer。假设当这个特定的QTimer超时时,我的程序恰好处于我所做的某些功能中(不在事件循环中),程序从我的函数到事件循环需要10ms。这是否意味着下次QTimer超时时间为1010ms?

如果是这种情况,有没有办法解决它?

感谢。

编辑: Timer results

2 个答案:

答案 0 :(得分:2)

当您使用延迟d的Qtimer时,它会在经过这段时间后触发timeout()信号,并且只要处理了窗口系统事件队列中的所有事件。

因此,如果您的程序花费的时间不在事件循环中那么它就没问题了。无论如何,无论是否在Qt中,将超时设置为t ms实际上意味着, 在至少t ms已通过 时将其唤醒。你不能保证准确无误。

ps:如果你担心很少ms,那么你应该担心时间粒度。

答案 1 :(得分: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的第121个刻度正好在60500ms ...但在60000ms所有计时器碰撞创建延迟执行。