这是我这边的测试效果,红色的是设置50ms,绿色的是100ms
WIN32接口SetTimer用起来简单,但本身精度就不是很高,它类似于Sleep,在多任务操作系统中的优先级很低,不能得到及时响应,只能用于要求不高的延时程序中。在时间跨度越大的情况下才越有利。
如果你对精度要求非常高的话,推荐使用下面的方式:
在自己的专用线程中获取当前时间,timeGetTime是个不错的选择,微软公司在其多媒体Windows中提供了精确定时器的底层API支持,利用多媒体定时器timeGetTime可以很精确地读出系统的当前时间。相比于GetTickCount来说,同样是返回的ms级的当前时钟(计算机启动后经历的时间间隔),但是精度要比WM_TIMER消息映射高,不过使用之前必须将 Winmm.lib 和 Mmsystem.h 添加到工程中。
如果需要更高的精度控制,QueryPerformanceFrequency和QueryPerformanceCounter就能派上用场了。这两个函数是Windows提供的仅供Windows 95及其后续版本使用的精确时间函数,并要求计算机从硬件上支持精确定时器。在进行定时之前,先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率, 然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经历的精确时间。其定时误差不超过1微秒,精度与CPU等机器配置有关。
一般精度越高的,占用的系统资源相对就越高,所以如果不是严格要求精度的场合,一般的定时器就够用了。