提高QTimer准确度

时间:2015-06-03 17:30:09

标签: c++ qt

我正在使用QT 4.7,并且有一个定时器,根据所需的声音类型,每秒执行2次或每秒4次。

    void Keypad::SoundRequest(bool allowBeeps, int beepType)
    {

        // Clear any Previous active Timer
        if (sound1Timer->isActive() == true)
        {
            sound1Timer->stop();
        }
        else if(sound2Timer->isActive() == true)
        {
            sound2Timer->stop();
        }

        // Zero out main 
        (void) memset(&soundmain_t, (char) 0, sizeof(soundmain_t));
        // Zero out sound1
        (void) memset(&sound1_t, (char) 0, sizeof(sound1_t));
        // Zero out the sound2
        (void) memset(&sound2_t, (char) 0, sizeof(sound2_t));

        if (allowBeeps == true)
        {
            if(beepType == OSBEEP)
            {
                sound1Timer->start(500); // 250mS On / 250mS off called every 500mS = 2HZ
            }
            else if (beepType == DOORBEEP)
            {
                sound2Timer->start(250); // 125mS On / 125mS off called every 250mS = 4HZ
            }

        }
        else if (allowBeeps == false)
        {
            //Shut the Beeper Down

            if (sound1Timer->isActive() == true)
            {
                sound1Timer->stop();
            }
            else if(sound2Timer->isActive() == true)
            {
                sound2Timer->stop();
            }

            SOUND_BLAST(0, &soundmain_t);
        }


    }

Constructor:

    sound1Timer = new QTimer(this);
    sound2Timer = new QTimer(this);

    connect(sound1Timer, SIGNAL(timeout()), this, SLOT(sound1Handler()));
    connect(sound2Timer, SIGNAL(timeout()), this, SLOT(sound2Handler()));



SLOTS:

void Keypad::sound1Handler()
{
    // Sound a 250mS chirp
    SOUND_BLAST(0, &sound1_t);
}

// Public SLOT, Called by sound2Timer()
// Sounds a single 125mS Beep

void Keypad::sound2Handler()
{
    // Emit a Single 125mS chirp
    SOUND_BLAST(0, &sound2_t);
}

定时器大部分都是准确的,但它并不总是2Hz或4Hz。为了提高准确性,我考虑使用更快的计时器,例如25mS并让它运行,每次累积到250mS或125mS然后发出哔哔声。但是,我不确定这是否会使其更准确。

我应该用QElapsedTimer()测量执行时间并减去sound1Timer和sound2Timer间隔的开销吗?有一个更好的方法吗?

1 个答案:

答案 0 :(得分:3)

计时器的准确性受操作系统的限制。 Qt库“使用”操作系统计时器“。

如果你需要高精度,我会有一个定时器子程序,它读取基于硬件的时钟来确定事件的时间。您需要深入了解操作系统文档以获取详细信息。