可等待计时器对象

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

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

 

注意

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

 

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

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

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

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

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

异步过程调用

使用可等待计时器对象