首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ Builder 高精度計時技術詳解:突破 55ms 限制

     編輯:關於C++

在 Windows 95 時代,Visual C++、Delphi、C++ Builder 等視覺化開發工具雖然都內建了 Timer 元件,使用方便,但其最小計時精度僅約 55 毫秒。更關鍵的是,定時器訊息在多任務作業系統中的優先級極低,往往無法獲得及時響應,難以滿足即時控制環境的嚴格需求。

Win32 API 提供的高精度計時方案

Microsoft 在 Win32 API 函數庫中提供了一組用於高精度計時的底層函數,若使用得當,計時精度可達 1 毫秒,完全能滿足一般即時系統控制的要求。C++ Builder 4.0 對這些 API 進行了封裝,提供了功能、參數與 Win32 API 基本一致的介面函數,使用時需引入 mmsystem.h 標頭檔。

核心 API 函數詳解

1. timeGetTime - 獲取系統啟動後的毫秒數

DWORD timeGetTime(void);

返回自 Windows 啟動以來經過的毫秒數,最大值為 232,約為 49.71 天。此函數適合用於簡單的時間間隔測量。

2. timeSetEvent - 設定定時回呼事件

MMRESULT timeSetEvent(
    UINT uDelay,           // 事件週期(毫秒)
    UINT uResolution,      // 延遲精度(毫秒),值越小精度越高,預設 1ms
    LPTIMECALLBACK lpTimeProc, // 回呼函數指標
    DWORD dwUser,          // 使用者自訂資料
    UINT fuEvent           // 事件類型
);

此函數可建立一次性 (TIME_ONESHOT) 或週期性 (TIME_PERIODIC) 定時事件。事件觸發時會呼叫指定的回呼函數,成功返回事件識別碼,失敗返回 NULL。

3. timeKillEvent - 取消定時事件

MMRESULT timeKillEvent(UINT uTimerID);

根據 timeSetEvent 返回的識別碼取消指定的定時回呼事件。成功返回 TIMERR_NOERROR,若定時器不存在則返回 MMSYSERR_INVALPARAM。

4. TimeProc 回呼函數規範

void CALLBACK TimeProc(
    UINT uID, UINT uMsg,
    DWORD dwUser, DWORD dw1, DWORD dw2
);

應用程式定義的回呼函數,在定時器事件發生時被呼叫。關鍵限制:回呼函數中僅能呼叫極少數 API 函數(如 PostMessage、timeGetTime、timeSetEvent、timeKillEvent、MIDI 輸出函數、OutputDebugString 等),且程式碼必須極度精簡,避免耗時操作導致系統響應延遲。

實戰注意事項

  • 資源消耗:將定時精度設至毫秒級會佔用大量 CPU 時間和系統資源,在滿足控制需求的前提下,應盡量增大 uResolution 參數值。
  • 及時釋放:定時器即時控制功能完成後,必須盡快釋放相關資源。
  • 精度與效能平衡:根據實際應用場景權衡精度需求與系統負載。

掌握這組高精度計時函數,能讓 C++ Builder 開發者突破傳統 Timer 元件的限制,構建更可靠的即時控制應用程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved