針對工業控制、即時資料擷取等嚴格定時需求,系統比較 VC++ 七種定時方案精度、CPU 佔用、適用場景,附完整代碼範例與測試圖表。
| 方案 | API/類別 | 精度 | CPU 佔用 | 適用場景 |
|---|---|---|---|---|
| 1. WM_TIMER | SetTimer/OnTimer | ≥30ms | 極低 | 動畫、進度條等非關鍵 UI 更新 |
| 2. Sleep | Sleep(ms) | ≥30ms | 極高(阻塞) | 簡單延遲,無訊息處理需求 |
| 3. COleDateTime | COleDateTime/COleDateTimeSpan | 秒級 | 中(含訊息迴圈) | 需處理訊息的秒級延遲 |
| 4. GetTickCount | GetTickCount() | ~15ms(短)、較佳(長) | 高(忙等待) | 短時程高精度,可加訊息迴圈降低 CPU |
| 5. timeGetTime | timeGetTime() | 1ms | 高(忙等待) | 多媒體同步、資料採集 |
| 6. timeSetEvent | timeSetEvent/callback | 1ms | 低(系統排程) | 週期性精確任務:採樣、控制迴路 |
| 7. QueryPerformanceCounter | QPC/QPF | ≤1μs | 高(忙等待) | 效能分析、基準測試、極高精度需求 |
DWORD start = GetTickCount(), now;
do { now = GetTickCount() - start; } while (now < 50);
timeBeginPeriod(1);
MMRESULT id = timeSetEvent(10, 1, TimerProc, 0, TIME_PERIODIC);
// TimerProc: 必須在 10ms 內完成
timeKillEvent(id); timeEndPeriod(1);
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 行為的必要性。
WM_TIMER。timeSetEvent(最佳平衡)。QueryPerformanceCounter。QPC(風險自負)。