1

我知道GetTickCount()并且timeGetTime()有不同的分辨率,并且timeGetTime()可以通过调用来设置计时器分辨率timeBeginPeriod()

我的理解是,增加计时器的分辨率使用timeBeginPeriod()减少了系统在连续递增到后面的计数器之间的睡眠时间timeGetTime()

假设时间分辨率GetTickCount()为 16ms(其值每 16ms 增加 16),我将分辨率设置timeGetTime()为 1ms(其值每 1ms 增加 1)。我的问题是关于刻度计数器更新的时间点。我编写了一个小型测试程序,以查看在滴答计数器增加时计时器落后于滴答计数器的滞后情况。滞后我的意思是不同GetTickCount()-timeGetTime()就在GetTickCount()更新时。例如,滞后 0 意味着当函数timeGetTime()返回 32 时滴答计数器从 16 更新到 32,滞后 4 意味着当timeGetTime()返回 28 时滴答计数器从 16 增加到 32。这是代码:

#include <windows.h>
#include <iostream>
#include <vector>

int main(void) {

    // set time resolution to 1ms
    timeBeginPeriod(1);

    // measure tick counter interval for low resolution
    std::vector<int> difftime(200);
    int lasttick;

    for (int i = 0; i < 200; ++i) {
        lasttick = GetTickCount();
        while (!(GetTickCount()-lasttick)) ;
        difftime[i] = GetTickCount() - timeGetTime();
    }

    // reset timer resolution
    timeEndPeriod(1);

    // printout
    std::cout << "timediff" << std::endl;
    for (int i = 0; i < 200; ++i) {
        std::cout << difftime[i] << std::endl;
    }

    return 0;
}

令我惊讶的是,虽然两个函数之间的延迟在我的程序一次运行期间是恒定的,但在程序的重复执行之间差异很大。我希望这两个函数背后的计数器总是在后台运行,所以我认为执行之间的延迟应该是恒定的。

起初我认为增加timeGetTime()-timer 的分辨率可能会通过在两者之间引入一些随机延迟来导致这种情况,但是当我在执行之间将分辨率保持在 1 毫秒时,执行之间的延迟仍然会有所不同。

有谁知道是什么机制导致这种行为?

4

0 回答 0