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

VC++ Windows 精確定時七大方案深度解析:從 WM_TIMER 到 QueryPerformanceCounter

     編輯:關於VC++

針對工業控制、即時資料擷取等嚴格定時需求,系統比較 VC++ 七種定時方案精度、CPU 佔用、適用場景,附完整代碼範例與測試圖表。

七大方案對照表

方案API/類別精度CPU 佔用適用場景
1. WM_TIMERSetTimer/OnTimer≥30ms極低動畫、進度條等非關鍵 UI 更新
2. SleepSleep(ms)≥30ms極高(阻塞)簡單延遲,無訊息處理需求
3. COleDateTimeCOleDateTime/COleDateTimeSpan秒級中(含訊息迴圈)需處理訊息的秒級延遲
4. GetTickCountGetTickCount()~15ms(短)、較佳(長)高(忙等待)短時程高精度,可加訊息迴圈降低 CPU
5. timeGetTimetimeGetTime()1ms高(忙等待)多媒體同步、資料採集
6. timeSetEventtimeSetEvent/callback1ms低(系統排程)週期性精確任務:採樣、控制迴路
7. QueryPerformanceCounterQPC/QPF≤1μs高(忙等待)效能分析、基準測試、極高精度需求

關鍵代碼範例

方案 4:GetTickCount 50ms 精確延遲

DWORD start = GetTickCount(), now;
do { now = GetTickCount() - start; } while (now < 50);

方案 6:timeSetEvent 週期性回呼

timeBeginPeriod(1);
MMRESULT id = timeSetEvent(10, 1, TimerProc, 0, TIME_PERIODIC);
// TimerProc: 必須在 10ms 內完成
timeKillEvent(id); timeEndPeriod(1);

方案 7:QueryPerformanceCounter 1μs 精確延遲

LARGE_INTEGER freq, st, ed; double dt;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&st);
do {
    QueryPerformanceCounter(&ed);
    dt = (double)(ed.QuadPart - st.QuadPart) / freq.QuadPart;
} while (dt < 0.000001); // 1μs

實測 Sleep(100) 真實誤差

以方案 7 量測 Sleep(100) 實際耗時,每次誤差 ±1~2ms,證明高精度計時器對驗證系統 API 行為的必要性。

選型建議

  • UI 非關鍵:WM_TIMER。
  • 週期性控制/採樣:timeSetEvent(最佳平衡)。
  • 效能計測/基準測試:QueryPerformanceCounter。
  • 需突破 1ms 間隔:多執行緒輪詢 QPC(風險自負)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved