}//
这样在延时的时候我们也能够处理其他的消息。
方式四:在精度要求较高的情况下,
VC 中可
以利用
GetTickCount()
函数,该函数的返回值是
DWORD 型,表示以 ms 为单位的计算机启动后经历的时间间隔。精度比 WM_TIMER 消息映射高,
在较
短的定时中其计时误差为 15ms,在较长的定时中其计时误差较低,如果定时时间太长,就好象死
机一样,
CPU 占用率非常高,只能用于要求不高的延时程序中。如示例工程中的 Timer4 和 Timer4_1。下列代
码可以实现
50ms 的精确定时:
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
do
{
dwEnd = GetTickCount()-dwStart;
}while(dwEnd <50);为使 GetTickCount()函数在延时或定时期间能处理其他的消息,可以把代码
改为:
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
do
{
MSG msg;
GetMessage(&msg,NULL,0,0);
TranslateMessage(&msg);
DispatchMessage(&msg);
dwEnd = GetTickCount()-dwStart;
}while(dwEnd <50);虽然这样可以降低 CPU 的占有率,并在延时或定时期间也能处理其他的消息,
但降低了延时或定时精度。
方式五:与 GetTickCount()函数类似的多媒体定时器函数 DWORD
timeGetTime(void)
,该函数定时精
度为 ms 级,返回从 Windows 启动开始经过的毫秒数。微软公司在其多媒体 Windows 中提供了
精确定时器的底
层 API 持,利用多媒体定时器可以很精确地读出系统的当前时间,并且能在非常精确的时间间隔
内完成一
个事件、函数或过程的调用。不同之处在于调用 DWORD timeGetTime(void) 函数之前必须将
Winmm.lib
和
Mmsystem.h 添加到工程中,否则在编译时提示 DWORD timeGetTime(void)函数未定义。
由于使用该
函数是通过查询的方式进行定时控制的,所以,应该建立定时循环来进行定时事件的控制。如示
例工程中的
Timer5 和 Timer5_1。
方式六:使用多媒体定时器 timeSetEvent()函数,该函数定时精度为 ms 级。利用该函数
可以实现周期性的函数调用。如示例工程中的
Timer6 和 Timer6_1
。函数的原型如下:
MMRESULT timeSetEvent
(
UINT uDelay,
UINT uResolution,
LPTIMECALLBACK lpTimeProc,
WORD dwUser,
UINT fuEvent ) 该函数设置一个定时回调事件,此事件可以是
一个一次性事件或周期性事件。事件一旦被激活,便调用指定的回调函数,
成功后返回事件的标识符代码,否则返回 NULL。函数的参数说明如下:
uDelay:以毫秒指定事件的周期。
Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为 1ms。
LpTimeProc:指向一个回调函数。
DwUser:存放用户提供的回调数据。
FuEvent:指定定时器事件类型:
TIME_ONESHOT:uDelay 毫秒后只产生一次事件
TIME_PERIODIC :每隔 uDelay
毫秒周期性地产生事件。
具体应用时,可以通过调用
timeSetEvent()函数,将需要周期性执行的任务定义在 LpTimeProc
回调函数
中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是,任务处理的时间不能大
于周期间隔时间。另外,在定时器使用完毕后,
应及时调用 timeKillEvent()
将之释放。