Windows为非实时系统,它的Timer通常精度不是很高,下面是常用的Timer设置处理
常用的时间精度
1. SetTimer/OnTimer
根据MSDN中的定义,可以知道,最下值是参考宏USER_TIMER_MINIMUM.
If uElapse is less than USER_TIMER_MINIMUM, the timeout is set to USER_TIMER_MINIMUM.
If uElapse is greater than USER_TIMER_MAXIMUM, the timeout is set to USER_TIMER_MAXIMUM.
Windows 98中55毫秒,Windows NT中,定时器的分辨率为10毫秒。
#define USER_TIMER_MAXIMUM 0x7FFFFFFF
#define USER_TIMER_MINIMUM 0x0000000A
2. Sleep(0)/Sleep(1)
Sleep(n)的作用是让当前线程睡眠n毫秒,以便执行其他线程,如果没有其他线程,那睡眠n毫秒后,继续执行。
根据MSDN中的定义设置为0时,检查一下是否busy,不忙时立即返回处理
A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If no other threads of equal priority are ready to run, the function returns immediately, and the thread continues execution.
(http://blog.sina.com.cn/s/blog_605f5b4f0100zcqx.html换上了双核cpu后,问题出来了:Sleep(0)经常会比预期中更早返回。)
3. timeSetEvent-timeBeginPeriod-timeEndPeriod
调用之后用timeSetTime()注册一个回调函数,即一个中断处理过程。
给Windows驱动程序最精确的周期性通知是由Windows的多媒体服务timeSetEvent()提供的。它的时间可以精确到1毫秒。
多媒体播放/录制控制时,可以采用这个作为精度,相对比较可靠。
4. QueryPerformanceFrequency()和 QueryPerformanceCounter()函数
理论上可以达到更高的精度
QueryPerformanceFrequency返回硬件支持的高精度计数器的频率。
QueryPerformanceCounter用于得到高精度计时器的值(如果存在这样的计时器)
Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源