可等待定时器是多媒体定时器吗?

2022-01-30 14:58:27 标签 winapitimer

它说:

多媒体计时器服务允许应用程序以尽可能高的分辨率(或准确性)为硬件平台调度计时器事件。这些多媒体计时器服务允许您以比其他计时器服务更高的分辨率来安排计时器事件。

但它也说(强调我的):

不使用高分辨率定时的应用程序应该使用SetTimer函数而不是多媒体定时服务。SetTimer提供的定时器服务将WM_TIMER消息发送到消息队列,而多媒体定时器服务调用一个回调函数。需要等待计时器的应用程序应该使用CreateWaitableTimer函数。

我发现这段代码:

timer = CreateWaitableTimer(NULL, TRUE, NULL);
SetWaitableTimer(timer, &due, 0, NULL, NULL, 0);
WaitForSingleObject(timer, INFINITE);
CloseHandle(timer);

导致相当不精确(+/- 1毫秒)的等待。使用QueryPerformanceCounter()和繁忙等待,我可以轻松实现微秒精度。

所以这意味着CreateWaitableTimer()不是一个“多媒体定时器”,因此不“允许我安排定时器事件与最大的分辨率”?

有没有类似的API,我可以使用它来更精确地等待,而不用吃掉整个CPU核心?

###回答标题问题:

按照你所链接的文章的导航路线,你应该使用CreateTimerQueueTimer()来创建/使用这样一个“多媒体定时器”的API例程。这将在指定的时间/期间调度一个或多个回调,而不需要任何显式的“等待”代码/调用,并(大概)将为您的定时事件提供最好的(~1毫秒)分辨率/准确性。

这(至少对我来说)意味着这个CreateTimerQueueTimer()函数创建了链接页面所称的“多媒体计时器”,这是由于短语(您引用的):“而多媒体计时器服务调用一个回调函数”。从CreateWaitableTimer()调用返回的“waitabletimer”只会满足使用回调的要求,如果你指定一个有效的函数作为下面SetWaitableTimer()调用的第4个参数(你的简短示例代码没有这样做)。

为了解决你的第二点:是否有一个类似的API,我可以使用它来更精确地等待,而不用吃掉整个CPU核心?

据我所知没有。当使用QPC函数和时钟(“轮询”)时,CPU使用和等待精度之间总会有一个权衡;事情就是这样。

您也许可以考虑使用能够产生硬件中断的板外计时器芯片(这是我为需要以亚毫秒级精度控制设备的软件所做的工作)——但这可能超出了您的职责范围。

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码