关于计时器

本主题介绍如何创建、标识、设置和删除计时器。 应用程序使用计时器为窗口计划指定时间过后的事件。 每次计时器的指定间隔(或超时值)过去后,系统都会通知与该计时器关联的窗口。 由于计时器的准确性取决于系统时钟速率以及应用程序从消息队列中检索消息的频率,因此超时值只是近似值。

本主题包含以下各节。

计时器操作

应用程序使用 SetTimer 函数创建计时器。 一个新的计时器会在创建后立即开始计时。 应用程序可以使用 SetTimer 更改计时器的超时值,以及使用 KillTimer 函数销毁计时器。 若要有效地使用系统资源,应用程序应销毁不再需要的计时器。

每个计时器都有一个唯一标识符。 创建计时器时,应用程序可以指定一个标识符或让系统创建一个唯一值。 WM_TIMER 消息的第一个参数包含发布消息的计时器的标识符。

如果在对 SetTimer 的调用中指定窗口句柄,应用程序会将计时器与该窗口相关联。 每当计时器的超时值过去时,系统会向与计时器关联的窗口发布 WM_TIMER 消息。 如果未在对 SetTimer 的调用中指定任何窗口句柄,则创建计时器的应用程序必须监视其 WM_TIMER 消息的消息队列并将这些消息调度到相应的窗口。

注意

如果指定可选的 TIMERPROC 回调函数,则会在消息循环期间调用该函数,并且不会将 WM_TIMER 调度到 WNDPROC 回调。

如果需要在计时器超时时收到通知,请使用可等待计时器。 有关详细信息,请参阅可等待计时器对象

高分辨率计时器

计数器是编程中用于指代递增变量的一个通用术语。 某些系统包括提供高分辨率已过时间的高分辨率性能计数器。

如果系统上存在高分辨率性能计数器,则可以使用 QueryPerformanceFrequency 函数来以每秒计数数量的形式表示频率。 计数的值取决于处理器。 例如,在某些处理器上,计数可能是处理器时钟的周期速率。

QueryPerformanceCounter 函数将检索高分辨率性能计数器的当前值。 通过在一段代码的开头和结尾调用此函数,应用程序实质上将计数器用作了高分辨率计时器。 例如,假设 QueryPerformanceFrequency 指示高分辨率性能计数器的频率为每秒 50,000 个计数。 如果应用程序紧邻该段代码之前和之后调用 QueryPerformanceCounter,计数器值可能分别为 1500 个计数和 3500 个计数。 这些值指示执行代码时经过了 .04 秒(2000 个计数)。

可等待计时器对象

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

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

有关使用可等待计时器对象进行线程同步的详细信息,请参阅可等待计时器对象