background image

  方式二:

VC 中使用 sleep()函数实现延时,它的单位是 ms,如延时 2 秒,用

sleep(2000)

 

。精度非常 低,最小计时精度仅为

30ms,用 sleep 函数的不利处在于延时期间

 

不能处理其他的消息,如果时间太 长,就好象死机一样,

CPU 占用率非常高,只能用于要求

不高的延时程序中。如示例工程中的

Timer2。

  方式三:利用

COleDateTime 类和 COleDateTimeSpan 类结合 WINDOWS 的消息处理

过程来实现秒级延时。如示例工程中的

Timer3 和 Timer3_1。以下是实现 2

 

秒的延时代码:

      

COleDateTime      start_time = COleDateTime::GetCurrentTime();      COleDateTimeSpan 

end_time= COleDateTime::GetCurrentTime()-start_time;      while(end_time.GetTotalSeconds()< 2) //
实现延时

2 秒     {               MSG   msg;              GetMessage(&msg,NULL,0,0); 

TranslateMessage(&msg);               DispatchMessage(&msg);                           //以上四行是实现在延
时或定时期间能处理其他的消息,      

 //虽然这样可以降低 CPU 的占有率,             //

但降低了延时或定时精度,实际应用中可以去掉。

             end_time = 

COleDateTime::GetCurrentTime()-start_time;      }//这样在延时的时候我们也能够处理其他的消息。 

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

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 )