可等待定時器
可等待定時器對象是Windows操作系統的一種同步對象,當設定的期限到了時,對象被置為signaled狀態。[1]
可創建兩種可等待定時器對象:
- 手工重置(manual-reset):保持signaled狀態直至調用SetWaitableTimer函數設置了新的期限。
- 同步(synchronization):保持signaled狀態直至一個線程在該對象上完成了等待操作。
兩種可等待定時器對象都可以是周期定時器(periodic timer)。周期定時器在每次周期到期時可重新激活,直至它被重置或者被取消。周期定時器或者是手工重置定時器或者是同步定時器。
當定時器變為signaled狀態, 處理器須執行相關的指令(如completion routine)。高頻率的定時器使得處理器處於繁忙狀態,阻止其進入低能耗狀態。考慮在程序中使用事件通知而不是定時器通知。如果必須使用定時器,考慮使用一次性定時器而不是周期定時器。或者設置周期定時器的間隔大於1秒鐘。
線程使用CreateWaitableTimer或CreateWaitableTimerEx函數創建定時器對象,並指明是手工重置定時器還是同步定時器,還可指定定時器的名字. 其他進程中的線程可以指出定時器的名字,用OpenWaitableTimer函數打開一個已經存在的定時器。任何線程可以給出一個定時器的句柄,用等待函數(wait function)在該定時器對象上等待其狀態變為signaled.
線程調用SetWaitableTimer函數來激活定時器,使用CancelWaitableTimer函數設置定時器為無效(inactive)狀態。使用完定時器後,調用CloseHandle函數關閉它.
Windows操作系統對定時器對象的處理過程為:
- 當一個定時器被啟動(set),定時器對象的狀態為nonsignaled, 並被放在內核定時器隊列中。
- 當一個定時器到期,定時器對象置為signaled狀態。如果定時器有(綁定的)完成過程(completion routine), 該完成過程被放入啟動該定時期的線程的異步過程調用(APC)隊列,直至該線程進入可喚醒等待狀態(alertable wait state)時操作系統按照異步過程調用方式執行該過程. 如果為周期定時器,它再次被放入內核定時器隊列。
- 當一個定時器被取消,如果它處於等待期間,會從內核定時器隊列中刪除。如果定時器已經到期了並且在啟動該定時期的線程有一個APC處於排隊中,在線程APC隊列中刪除這個未執行的APC。 定時器的信號態(signaled state)不受影響。
參考文獻
- ^ MSDN:Waitable Timer Objects. [2016-09-05]. (原始內容存檔於2016-11-30).