利用C++Builder進行精確計時 (轉)

worldblog發表於2007-12-06
利用C++Builder進行精確計時 (轉)[@more@]

 

 利用C++Builder進行精確計時:namespace prefix = o ns = "urn:schemas--com::office" />

    雖然Win95下視覺化開發工具如VC、、C++Builder等都有專用的定時器Timer,而且使用很方便,可以實現一定的定時功能,但最小計時精度僅為55ms,且定時器訊息在多工操作中的優先順序很低,不能得到及時響應,往往不能滿足實時控制環境下的應用。不過Microsoft公司在
  庫中已經為提供了一組用於高精度計時的底層函式,如果使用者使用得當,計時精度可到1ms。這個計時精度、對於一般的實時系統控制完全可以滿足要求。現將由C++
  Builder 4.0提供的重新封裝後的一組與時間相關的主要介面函式(函式名、引數、功能與Win32 API基本相同)說明如下:

    1.D timeGetTime(void)

    返回從啟動開始經過的毫秒數。最大值為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,

OutputDeString。

同時也不要使用完成時間很長的API函式,程式儘可能簡短。使用以上一組函式就可以完成毫秒級精度的計時和控制(在C++Builder中使用時要將頭mmsystem.h加到程式中)。由於將定時控制精確到幾毫秒,定時器事件將佔用大量的時間和系統資源,所以在滿足控制要求的前提下,應儘量將引數uResolution的數值增大。而且定時器實時控制功能完成後要儘快釋放。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988938/,如需轉載,請註明出處,否則將追究法律責任。

相關文章