天天看點

【Win32彙編】定時器

 想要程式每隔一段時間實作某一功能,可以使用SetTimer函數向Windows申請一個定時器。

----------------------------------------分割線--------------------------------------------------

invoke    SetTimer,hWnd,nIDEvent,nElapse,lpTimerFunc

hWnd——視窗句柄

nIDEvent——定時器ID,如果有多個定時器,通過這個ID判斷是哪個定時器(wParam存儲ID值)

nElapse——時間間隔,機關ms,無論設定的值是多少,真實的間隔都将是55ms的整數倍

lpTimerFunc——回調函數

----------------------------------------分割線--------------------------------------------------

invoke    KIllTimer,hWnd,uIdEvent

----------------------------------------分割線--------------------------------------------------

定時器的實作方法有兩種

1、向視窗過程發送WM_TIMER消息

這種方法在設定定時器時lpTimerFunc必須設定為NULL。在視窗過程中,通過判斷wParam的值來辨識是哪個定時器發送的WM_TIMER。使用KillTimer銷毀定時器時,uIdEvent使用SetTimer中的nIDEvent。

2、使用回調函數

在申請定時器時一般将hWnd,nIDEvent設定成NULL,lpTimerFunc設定函數位址,這時定時器沒有函數ID,但定時器設定成功後SetTimer會傳回一個ID,可以存儲這個ID,在要銷毀這個定時器時uIdEvent使用這個ID。當然,也可以自己指定這個定時器ID,但是hWnd不能設定成NULL,否則,指定的ID無效。

注意:1、定時器是一個低級别的消息,Windows隻有在消息隊列中沒有其他消息時才會發送WM_TIMER消息,如果消息隊列中有消息累積,那麼WM_TIMER就會被丢棄,并且不會被補發;

           2、消息隊列中不會有多條WM_TIMER消息,如果消息隊列中已經有1條WM_TIMER消息沒有被處理,那麼,到了定時的時刻,兩條WM_TIMER會被合并成一條。