如何在WinXP下获得准确的1ms计时器滴答

sch*_*tbi 9 c++ windows winapi real-time timer

我试着每1毫秒调用一次函数.问题是,我喜欢用windows做这个.所以我尝试了多媒体时间API.

Multimediatimer API

资源

idTimer = timeSetEvent( 
     1, 
     0,
     TimerProc, 
     0, 
     TIME_PERIODIC|TIME_CALLBACK_FUNCTION ); 
Run Code Online (Sandbox Code Playgroud)

我的结果是大部分时间1毫秒都没问题,但有时我会得到双倍期.看看1.95ms附近的小凹凸 多媒体时间图http://www.freeimagehosting.net/uploads/8b78f2fa6d.png

我的第一个想法是,也许我的方法运行时间太长了.但我已经测量过了,情况并非如此.

排队计时器API

我的下一个尝试是使用queud计时器API

hTimerQueue = CreateTimerQueue();
if(hTimerQueue == NULL)
{
printf("Error creating queue: 0x%x\n", GetLastError());
}

BOOL res = CreateTimerQueueTimer(
&hTimer, 
hTimerQueue, 
TimerProc, 
NULL, 
0, 
1,  // 1ms
    WT_EXECUTEDEFAULT);
Run Code Online (Sandbox Code Playgroud)

但结果也不如预期.现在我大部分时间都是2毫秒的周期时间. queuedTimer http://www.freeimagehosting.net/uploads/2a46259a15.png

测量

为了测量时间,我使用了QueryPerformanceCounter和QueryPerformanceFrequency方法.

所以现在我的问题是,如果有人在Windows下遇到类似的问题,甚至可能找到解决方案?

谢谢.

Did*_*set 5

无需进入实时操作系统,您不能期望 1 ms 调用一次函数.

在不是实时操作系统的Windows上(对于Linux来说,它是类似的),一个以微秒精度重复读取当前时间并在直方图中存储连续差异的程序具有超过10毫秒的非空容器!这意味着有时您将有2毫秒,但您也可以在通话之间获得更多.