在 Windows 95 時代,Visual C++、Delphi、C++ Builder 等視覺化開發工具雖然都內建了 Timer 元件,使用方便,但其最小計時精度僅約 55 毫秒。更關鍵的是,定時器訊息在多任務作業系統中的優先級極低,往往無法獲得及時響應,難以滿足即時控制環境的嚴格需求。
Microsoft 在 Win32 API 函數庫中提供了一組用於高精度計時的底層函數,若使用得當,計時精度可達 1 毫秒,完全能滿足一般即時系統控制的要求。C++ Builder 4.0 對這些 API 進行了封裝,提供了功能、參數與 Win32 API 基本一致的介面函數,使用時需引入 mmsystem.h 標頭檔。
DWORD timeGetTime(void);
返回自 Windows 啟動以來經過的毫秒數,最大值為 232,約為 49.71 天。此函數適合用於簡單的時間間隔測量。
MMRESULT timeSetEvent(
UINT uDelay, // 事件週期(毫秒)
UINT uResolution, // 延遲精度(毫秒),值越小精度越高,預設 1ms
LPTIMECALLBACK lpTimeProc, // 回呼函數指標
DWORD dwUser, // 使用者自訂資料
UINT fuEvent // 事件類型
);
此函數可建立一次性 (TIME_ONESHOT) 或週期性 (TIME_PERIODIC) 定時事件。事件觸發時會呼叫指定的回呼函數,成功返回事件識別碼,失敗返回 NULL。
MMRESULT timeKillEvent(UINT uTimerID);
根據 timeSetEvent 返回的識別碼取消指定的定時回呼事件。成功返回 TIMERR_NOERROR,若定時器不存在則返回 MMSYSERR_INVALPARAM。
void CALLBACK TimeProc(
UINT uID, UINT uMsg,
DWORD dwUser, DWORD dw1, DWORD dw2
);
應用程式定義的回呼函數,在定時器事件發生時被呼叫。關鍵限制:回呼函數中僅能呼叫極少數 API 函數(如 PostMessage、timeGetTime、timeSetEvent、timeKillEvent、MIDI 輸出函數、OutputDebugString 等),且程式碼必須極度精簡,避免耗時操作導致系統響應延遲。
uResolution 參數值。掌握這組高精度計時函數,能讓 C++ Builder 開發者突破傳統 Timer 元件的限制,構建更可靠的即時控制應用程式。