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

SDK 計時器完整解析:SetTimer 三種用法、精度限制、WM_TIMER 訊息機制

     編輯:關於VC++

SetTimer / KillTimer 原型

UINT_PTR SetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);
BOOL KillTimer(HWND hWnd, UINT_PTR uIDEvent);

三種使用模式

模式hWndnIDEventlpTimerFunc處理方式KillTimer
1. 視窗+ID+訊息有效自訂 IDNULLWM_TIMER case wParam 判斷 IDKillTimer(hWnd, ID)
2. 視窗+ID+回調有效自訂 IDTimerProcDefWindowProc 自動呼叫 TimerProcKillTimer(hWnd, ID)
3. 無視窗+回調NULL忽略TimerProc回傳值為新 Timer IDKillTimer(NULL, retID)

TimerProc 簽名

VOID CALLBACK TimerProc(HWND hwnd, UINT msg, UINT_PTR idTimer, DWORD dwTime);

多計時器管理

#define TIMER_SEC 1
#define TIMER_MIN 2
SetTimer(hwnd, TIMER_SEC, 1000, nullptr);
SetTimer(hwnd, TIMER_MIN, 60000, nullptr);

case WM_TIMER:
    switch (wParam) {
        case TIMER_SEC: /* 每秒 */ break;
        case TIMER_MIN: /* 每分 */ break;
    }
    return 0;

改變間隔

同 hWnd/ID 再次呼叫 SetTimer 即可更新間隔。

精度與可靠性真相

  • 解析度限制:Win9x 約 55ms (18.2Hz),NT 系列 10ms (100Hz)。指定間隔會被截尾為 tick 整數倍
  • 低優先級:WM_TIMER 僅在訊息佇列空閒時處理,若 UI 執行緒忙碌會嚴重延遲
  • 訊息合併:多個 WM_TIMER 會合併為一個,導致「漏觸發」

正確做法:計時器只負責觸發,時間取自系統

case WM_TIMER:
    SYSTEMTIME st; GetLocalTime(&st);
    // 更新 UI 顯示 st.wHour, st.wMinute, st.wSecond
    return 0;

切勿在 WM_TIMER 中自行遞增計數器當作時間依據。

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