background image

      }//

      

这样在延时的时候我们也能够处理其他的消息。

  方式四:在精度要求较高的情况下,

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()

 

将之释放。