可等待定时器

可等待定时器对象是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）不受影响。

参考文献
 
协同控制
Microsoft Windows