C++ 提高QTimer精度

C++ 提高QTimer精度,c++,qt,C++,Qt,我使用的是Qt4.7,并且有一个计时器,它可以根据需要的声音类型每秒执行2次或4次函数 void Keypad::SoundRequest(bool allowBeeps, int beepType) { // Clear any Previous active Timer if (sound1Timer->isActive() == true) { sound1Timer->stop();

我使用的是Qt4.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间隔的开销?有更好的方法吗

计时器的精度受操作系统的限制。Qt库使用“隐藏”的操作系统计时器


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

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


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

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


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

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


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

这一点本身总是不准确的,因为其他(用户)事件正在主线程中处理并阻塞它。我会考虑使用另一个专用线程来做这个和其他方法来调度哔哔声(睡眠的某个变体)可能已经做了这个技巧。你是指工作者线程中的睡眠()吗?我不确定是否要引入另一个线程,但据我所知,声音线程只输出,根本不需要与主线程通信。因此,不应该有任何线程问题,如我可以告诉needed的信号量,这将始终是不准确的,因为其他(用户)事件正在主线程中处理并阻止它。我会考虑使用另一个专用线程来做这个和其他方法来调度哔哔声(睡眠的某个变体)可能已经做了这个技巧。你是指工作者线程中的睡眠()吗?我不确定是否要引入另一个线程,但据我所知,声音线程只输出,根本不需要与主线程通信。因此,不应该有任何线程问题,如我可以告诉needed的信号量,这将始终是不准确的,因为其他(用户)事件正在主线程中处理并阻止它。我会考虑使用另一个专用线程来做这个和其他方法来调度哔哔声(睡眠的某个变体)可能已经做了这个技巧。你是指工作者线程中的睡眠()吗?我不确定是否要引入另一个线程,但据我所知,声音线程只输出,根本不需要与主线程通信。因此,不应该有任何线程问题,如我可以告诉needed的信号量,这将始终是不准确的,因为其他(用户)事件正在主线程中处理并阻止它。我会考虑使用另一个专用线程来做这个和其他方法来调度哔哔声(睡眠的某个变体)可能已经做了这个技巧。你是指工作者线程中的睡眠()吗?我不确定是否要引入另一个线程,但据我所知,声音线程只输出,根本不需要与主线程通信。所以,正如我所知,不应该有任何像信号灯这样的线程问题