发信人: williamlong() 
整理人: jchao(1999-10-06 14:20:48), 站内信件
 | 
 
 
   虽然Win95下可视化开发工具如VC、Delphi、C++ Builder等都
 有专用的定时器控件Timer,而且使用很方便,可以实现一定的定时功
 能,但最小计时精度仅为55ms,且定时器消息在多任务操作系统中的
 优先级很低,不能得到及时响应,往往不能满足实时控制环境下的应
 用。不过Microsoft公司在Win32 API函数库中已经为用户提供了一组
 用于高精度计时的底层函数,如果用户使用得当,计时精度可到1ms。
 这个计时精度、对于一般的实时系统控制完全可以满足要求。现将由
 C++ Builder 4.0提供的重新封装后的一组与时间相关的主要接口函
 数(函数名、参数、功能与Win32 API基本相同)说明如下: 
 
   1.DWORD timeGetTime(void) 
   返回从Windows启动开始经过的毫秒数。最大值为232,约49.71
 天。 
   2.MMRESULT timeSetEvent( 
   UINT uDelay, 
   UINT uResolution, 
   LPTIMECALLBACK lpTimeProc, 
   DWORD dwUser, 
   UINT fuEvent 
    ) 
 
   该函数设置一个定时回调事件,此事件可以是一个一次性事件或
 周期性事件。事件一旦被激活,便调用指定的回调函数,成功后返回
 事件的标识符代码,否则返回NULL。参数说明如下:
 
   uDelay:以毫秒指定事件的周期。 
   UResolution:以毫秒指定延时的精度,数值越小定时器事件分辨
 率越高。缺省值为1ms。 
   LpTimeProc:指向一个回调函数。 
   DwUser:存放用户提供的回调数据。 
   FuEvent:指定定时器事件类型: 
   TIME_ONESHOT:uDelay毫秒后只产生一次事件 
   TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。 
 
   3.MMRESULT timeKillEvent(UINT uTimerID) 
   该函数取消一个指定的定时器回调事件。uTimerID标识要取消的
 事件(由timeSetEvent函数返回的标识符)。如果成功则返回
 TIMERR_NOERROR,如果定时器时间不存在则返回MMSYSERR_INVALPARAM
 。 
   void CALLBACK TimeProc( 
   UINT uID, 
   UINT uMsg, 
   DWORD dwUser, 
   DWORD dw1, 
   DWORD dw2 
    ); 
 
   该函数是一个应用程序定义的回调函数,出现定时器事件时该函
 数被调用。TimeProc是应用程序定义的函数名的占位符。使用该函数
 时要注意的是,它只能调用以下有限的几组API函数:PostMessage,
 timeGetSystemTime, timeGetTime, timeSetEvent,timeKillEvent
 ,midiOutShortMsg, midiOutLongMsg,OutputDebugString。同时也
 不要使用完成时间很长的API函数,程序尽可能简短。 
 
   使用以上一组函数就可以完成毫秒级精度的计时和控制(在C++
 Builder中使用时要将头文件mmsystem.h加到程序中)。由于将定时控
 制精确到几毫秒,定时器事件将占用大量的CPU时间和系统资源,所以
 在满足控制要求的前提下,应尽量将参数uResolution的数值增大。而
 且定时器实时控制功能完成后要尽快释放。
  --                                                  ☆ 蓝色月光 ☆ [email protected]                                               
  ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: bbs.huizhou.gd.]
  | 
 
 
 |