win32多媒体定时器
因为编程需要以1ms为周期调用一个函数,故在Windows平台上测试了一些定时器,并进行比较,最终选用timeSetEvent作为最终选项。
几个拉跨的定时器精度
select选择模型:15ms
Sleep(1) :15ms
Sleep(1) : 1-2ms //前提:在设置timeBeginPeriod(1)的情况下; // 设置精度为1毫秒
timeGetTime: 5ms
QueryPerformanceCounter:<1微秒 (win2000支持)
C++11 sleep_for(): 15ms
timeSetEvent(1): 0.95-1.05ms之间
精度达到1ms的定时器:多媒体定时器(win95支持)
原理分析:多媒体定时器被创建后,应用程序有一个定时器消息队列,系统以1ms(最高精度)的周期向程序发送定时器消息。当应用程序收到消息时,调用回调函数。此回调函数优先级非常高(最高),甚至可以将Sleep的精度压缩到1ms(通过屏蔽Sleep的方法)(普通线程为15ms,即便是将优先级拉到最高)。当回调函数的执行时间大于1ms (内部有如Sleep(1000))或者长耗时循环操作,会导致定时器消息积压,当挤压消失,系统会在1ms内多次(最高速度)调用回调函数 t<1ms,直到定时器消息队列为空,然后恢复1ms周期。
#pragma comment(lib,"winmm.lib")<