定时器MicrosoftWindows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。您的程序将时间间隔告诉Windows,例如“每10秒钟通知我一声”,然后Windows给您的程序发送周期性发生的WM_TIMER消息以表示时间到了。初看之下,Windows定时器似乎不如键盘和鼠标设备重要,而且对许多应用程序来说确实如此。但是,定时器比您可能认为的要重要得多,它不只用于计时程序,比如出现在工具列中的Windows时钟和这一章中的两个时钟程序。下面是Windows定时器的其它应用,有些可能并不那么明显:多任务虽然Windows98是一个优先权式的多任务环境,但有时候如果程序尽快将控制传回给Windows效率会更高。如果一个程序必须进行大量的处理,那么它可以将作业分成小块,每接收到一个WM_TIMER消息处理一块(我将在第二十章中对此做更多的讨论)。维护更新过的状态报告程序可以利用定时器来显示持续变化信息的“实时”更新,比如关于系统资源的变化或某个任务的进展情况。实现“自动储存”功能定时器提示Windows程序在指定的时间过去后把使用者的工作储存到磁盘上。终止程序展示版本的运行一些程序的展示版本被设计成在其开始后,多长时间结束,比如说,30分钟。如果时间已到,那么定时器就会通知应用程序。步进移动游戏中的图形对象或计算机辅助教学程序中的连续显示,需要按指定的速率来处理。利用定时器可以消除由于微处理器速度不同而造成的不一致。多媒体播放CD声音、声音或音乐的程序通常在背景播放声音数据。一个程序可以使用定时器来周期性地检查已播放了多少声音数据,并据此协调屏幕上的视觉信息。另一项应用可以保证程序在退出窗口消息处理程序后,能够重新得到控制。在大多数时情况下,程序不能够知道何时下一个消息会到来。定时器入门您可以通过调用SetTimer函数为您的Windows程序分配一个定时器。SetTimer有一个时间间隔范围为1毫秒到4,294,967,295毫秒(将近50天)的整数型态参数,这个值指示Windows每隔多久时间给您的程序发送WM_TIMER消息。例如,如果间隔为1000毫秒,那么Windows将每秒给程序发送一个WM_TIMER消息。当您的程序用完定时器时,它调用KillTimer函数来停止定时器消息。在处理WM_TIMER消息时,您可以通过调用KillTimer函数来编写一个“限用一次”的定时器。KillTimer调用清除消息队列中尚未被处理的WM_TIMER消息,从而使程序在调用KillTimer之后就不会再接收到WM_TIMER消息。系统和定时器Windows定时器是PC硬件和ROMBIOS架构下之定时器一种相对简单的扩充。回到Windows以前的MS-DOS程序编写环境下,应用程序能够通过拦截者称为timertick的BIOS中断来实现时钟或定时器。一些为MS-DOS编写的程序自己拦截这个硬件中断以实现时钟和定时器。这些中断每54.915毫秒产生一次,或者大约每秒18.2次。这是原始的IBMPC的微处理器频率值4.772720MHz被218所除而得出的结果。Windows应用程序不拦截BIOS中断,相反地,Windows本身处理硬件中断,这样应用程序就不必进行处理。对于目前拥有定时器的每个程序,Windows储存一个每次硬件timertick减少的计数。当这个计数减到0时,Windows在应用程序消息队列中放置一个WM_TIMER消息,并将计数重置为其最初值。因为Windows应用程序从正常的消息队列中取得WM_TIMER消息,所以您的程序在进行其它处理时不必担心WM_TIMER消息会意外中断了程序。在这方面,定时器类似于键盘和鼠标。驱动程序处理异步硬件中断事件,Windows把这些事件翻译为规律、结构化和顺序化的消息。在Windows98中,定时器与其下的PC定时器一样具有55毫秒的分辨率。在MicrosoftWindowsNT中,定时器的分辨率为10毫秒。Windows应用程序不能以高于这些分辨率的频率(在Windows98下,每秒18.2次,在WindowsNT下,每秒大约100次)接收WM_TIMER消息。在SetTimer调用中指定的时间间隔总是截尾后tick数的整数倍。例如,1000毫秒的间隔除以54.925毫秒,得到18.207个tick,截尾后是18个tick,它实际上是989毫秒。对每个小于55毫秒的间隔,每个tick都会产生一个WM_TIMER消息。定时器消息不是异步的因为定时器使用硬件定时器中断,程序编写者有时会误解,认为他们...