c – 如何在WinXP下获得准确的1ms定时器滴答
作者:互联网
我试着每1毫秒调用一次函数.问题是,我喜欢用windows做这个.所以我尝试了多媒体时间API.
Multimediatimer API
资源
idTimer = timeSetEvent(
1,
0,
TimerProc,
0,
TIME_PERIODIC|TIME_CALLBACK_FUNCTION );
我的结果是大部分时间1毫秒都没问题,但有时我会得到双倍期.看到1.95ms左右的小凹凸
multimediatimerHistogram 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);
但结果也不如预期.现在我大部分时间都是2毫秒的周期时间.
queuedTimer http://www.freeimagehosting.net/uploads/2a46259a15.png
测量
为了测量时间,我使用了QueryPerformanceCounter和QueryPerformanceFrequency方法.
题
所以现在我的问题是,如果有人在Windows下遇到类似的问题,甚至可能找到解决方案?
谢谢.
解决方法:
无需进入实时操作系统,您不能期望每1 ms调用一次函数.
在不是实时操作系统的Windows上(对于Linux来说,它是类似的),以微秒精度重复读取当前时间并在直方图中存储连续差异的程序具有大于10毫秒的非空容器!这意味着有时您将有2毫秒,但您也可以在通话之间获得更多.
标签:c,windows,winapi,timer,real-time 来源: https://codeday.me/bug/20191001/1840269.html