可等待定時器

可等待定時器對象是Windows操作系統的一種同步對象 ， 當設定的期限到了時 ， 對象被置爲signaled狀態 。 可創建兩種可等待定時器對象 ： 手工重置 （ 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 ） 不受影響 。