可等待计时器对象

可等待计时器对象是同步对象,其状态设置为在指定的到期时间到达时发出信号。 可以创建两种类型的可等待计时器:手动重置和同步。 任一类型的计时器也可以是定期计时器。

Object 说明
手动重置计时器 一个计时器,其状态在调用 SetWaitableTimer 以建立新的到期时间之前保持信号。
同步计时器 在线程完成对计时器对象的等待操作之前,其状态保持信号的计时器。
定期计时器 一个计时器,该计时器在每次指定的时间段过期时重新激活,直到计时器重置或取消。 定期计时器是定期手动重置计时器或定期同步计时器。

 

注意

当计时器发出信号时,处理器必须运行 来处理关联的指令。 高频率定期计时器使处理器持续繁忙,从而防止系统在任何有意义的时间内保持低功耗 状态 。 这可能对便携式计算机的电池使用时间和依赖于有效电源管理的方案(如大型数据中心)产生负面影响。 为了提高能效,请考虑在应用程序中使用基于事件的通知,而不是基于时间的通知。 如果需要计时器,请使用发出一次信号的计时器而不是定期计时器,或将间隔设置为大于 1 秒的值。

 

线程使用 CreateWaitableTimerCreateWaitableTimerEx 函数创建计时器对象。 创建线程指定计时器是手动重置计时器还是同步计时器。 创建线程可以指定计时器对象的名称。 其他进程中的线程可以通过在对 OpenWaitableTimer 函数的调用中指定其名称来打开现有计时器的句柄。 具有计时器对象句柄的任何线程都可以使用 等待函数 之一来等待计时器状态设置为信号。

  • 线程调用 SetWaitableTimer 函数来激活计时器。 请注意, SetWaitableTimer 使用以下参数:
  • 使用 lpDueTime 参数指定计时器设置为信号状态的时间。 当手动重置计时器设置为信号状态时,它将保持此状态,直到 SetWaitableTimer 建立新的到期时间。 当同步计时器设置为信号状态时,它将保持此状态,直到线程完成对计时器对象的等待操作。
  • 使用 SetWaitableTimer 函数的 lPeriod 参数指定计时器周期。 如果句点不为零,则计时器为定期计时器;每次期限到期时,都会重新激活该计时器,直到计时器重置或取消。 如果周期为零,则计时器不是定期计时器;它发出一次信号,然后停用。

线程可以使用 CancelWaitableTimer 函数将计时器设置为非活动状态。 若要重置计时器,请调用 SetWaitableTimer。 完成计时器对象后,调用 CloseHandle 以关闭计时器对象的句柄。

可等待计时器的行为可以汇总如下:

  • 设置计时器时,如果计时器已处于活动状态,计时器状态为未签名,并且计时器放置在内核计时器队列中,则会取消该计时器。
  • 当计时器过期时,计时器将设置为信号状态。 如果计时器具有完成例程,则会将其排队到设置计时器的线程。 完成例程保留在线程的 异步过程调用 (APC) 队列中,直到线程进入可发出警报的等待状态。 此时,将调度 APC 并调用完成例程。 如果计时器是定期的,则将其放回内核计时器队列中。
  • 取消计时器后,如果某个计时器处于挂起状态,则会将其从内核计时器队列中删除。 如果计时器已过期,并且仍有 APC 排队到设置计时器的线程,则 APC 将从该线程的 APC 队列中删除。 计时器的信号状态不受影响。

异步过程调用

使用可等待计时器对象