足球比分直播

定时器84772.doc

返回
定时器84772.doc_第1页
第1页 / 共100页
定时器84772.doc_第2页
第2页 / 共100页
定时器84772.doc_第3页
第3页 / 共100页
定时器84772.doc_第4页
第4页 / 共100页
定时器84772.doc_第5页
第5页 / 共100页
点击查看更多>>
资源描述:
定时器 壹佰软件开发小组 整理编译 Microsoft Windows 定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。您的程序将时间间隔告诉 Windows,例如「每10 秒钟通知我一声」,然后 Windows 给您的程序发送周期性发生的 WM_TIMER 消息以表示时间到了。初看之下,Windows 定时器似乎不如键盘和鼠标设备重要,而且对许多应用程序来说确实如此。但是,定时器比您可能认为的要重要得多,它不只用于计时程序,比如出现在工具列中的 Windows 时钟和这一章中的两个时钟程序。下面是 Windows 定时器的其它应用,有些可能并不那么明显? 多任务虽然 Windows 98 是一个优先权式的多任务环境,但有时候如果程序尽快将控制传回给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 硬件和 ROM BIOS 架构下之定时器一种相对简单的扩充。回到 Windows 以前的 MS-DOS 程序写作环境下,应用程序能够通过拦截者称为timer tick 的 BIOS 中断来实作时钟或定时器。一些为 MS-DOS 编写的程序自己拦截这个硬件中断以实作时钟和定时器。这些中断每 54.915 毫秒产生一次,或者大约每秒 18.2 次。这是原始的 IBM PC 的微处理器时脉值 4.772720 MHz 被 218 所除而得出的结果。Windows 应用程序不拦截 BIOS 中断,相反地,Windows 本身处理硬件中断,这样应用程序就不必进行处理。对于目前拥有定时器的每个程序,Windows储存一个每次硬件 timer tick 减少的计数。当这个计数减到 0 时,Windows 在应用程序消息队列中放置一个 WM_TIMER 消息,并将计数重置为其最初值。因为 Windows 应用程序从正常的消息队列中取得WM_TIMER 消息,所以您的程序在进行其它处理时不必担心 WM_TIMER 消息会意外中断了程序。在这方面,定时器类似于键盘和鼠标。驱动程序处理异步硬件中断事件,Windows 把这些事件翻译为规律、结构化和顺序化的消息。在 Windows 98 中,定时器与其下的 PC 定时器一样具有 55 毫秒的分辨率。在 Microsoft Windows NT 中,定时器的分辨率为 10 毫秒。Windows 应用程序不能以高于这些分辨率的频率(在Windows 98 下,每秒 18.2 次,在 Windows NT 下,每秒大约 100 次)接收 WM_TIMER 消息。在 SetTimer呼叫中指定的时间间隔总是截尾后 tick 数的整数倍。例如,1000 毫秒的间隔除以 54.925 毫秒,得到18.207 个 tick,截尾后是 18 个 tick,它实际上是989 毫秒。对每个小于 55 毫秒的间隔,每个 tick 都会产生一个 WM_TIMER 消息。定时器消息不是异步的因为定时器使用硬件定时器中断,程序写作者有时会误解,认为他们的程序会异步地被中断来处理WM_TIMER 消息。然而,WM_TIMER 消息并不是异步的。WM_TIMER 消息放在正常的消息队列之中,和其它消息排列在一起,因此,如果在 SetTimer 呼叫中指定间隔为 1000 毫秒,那么不能保证程序每 1000 毫秒或者 989 毫秒就会收到一个 WM_TIMER 消息。如果其它程序的执行事件超过一秒,在此期间内,您的程序将收不到任何WM_TIMER 消息。您可以使用本章的程序来展示这一点。事实上,Windows 对 WM_TIMER 消息的处理非常类似于对 WM_PAINT 消息的处理,这两个消息都是低优先级的,程序只有在消息队列中没有其它消息时才接收它们。WM_TIMER 还在另一方面和 WM_PAINT 相似Windows不能持续向消息队列中放入多个 WM_TIMER 消息,而是将多余的 WM_TIMER 消息组合成一个消息。因此,应用程序不会一次收到多个这样的消息,尽管可能在短时间内得到两个 WM_TIMER 消息。应用程序不能确定这种处理方式所导致的 WM_TIMER 消息「遗漏」的数目。这样,WM_TIMER 消息仅仅在需要更新时才提示程序,程序本身不能经由统计 WM_TIMER 消息的数目来计时(在本章后面,我们将编写两个每秒更新一次的时钟程序,并可以看到如何做到这一点)。为了方便起见,下面在讨论时钟时,我将使用「每秒得到一次 WM_TIMER 消息」这样的叙述,但是请记住,这些消息并非精确的 tick 中断。定时器的使用三种方法如果您需要在整个程序执行期间都使用定时器,那么您将得从 WinMain 函数中或者在处理 WM_CREATE 消息时呼叫 SetTimer,并在退出 WinMain 或响应WM_DESTROY 消息时呼叫 KillTimer。根据呼叫SetTimer 时使用的参数,可以下列三种方法之一使用定时器。方法一这是最方便的一种方法,它让 Windows 把 WM_TIMER消息发送到应用程序的正常窗口消息处理程序中,SetTimer 呼叫如下所示SetTimer hwnd, 1, uiMsecInterval, NULL ;第一个参数是其窗口消息处理程序将接收 WM_TIMER消息的窗口句柄。第二个参数是定时器 ID,它是一个非 0 数值,在整个例子中假定为 1。第三个参数是一个 32 位无正负号整数,以毫秒为单位指定一个时间间隔,一个 60,000 的值将使 Windows 每分钟发送一次 WM_TIMER 消息。您可以通过呼叫KillTimer hwnd, 1 ;在任何时刻停止 WM_TIMER 消息(即使正在处理WM_TIMER 消息)。此函数的第二个参数是 SetTimer呼叫中所用的同一个定时器 ID。在终止程序之前,您应该响应 WM_DESTROY 消息停止任何活动的定时器。当您的窗口消息处理程序收到一个 WM_TIMER 消息时,wParam 参数等于定时器的 ID 值(上述情形为 1),lParam 参数为 0。如果需要设定多个定时器,那么对每个定时器都使用不同的定时器 ID。wParam 的值将随传递到窗口消息处理程序的 WM_TIMER 消息的不同而不同。为了使程序更具有可读性,您可以使用define 叙述定义不同的定时器 IDdefine TIMER_SEC 1define TIMER_MIN 2然后您可以使用两个 SetTimer 呼叫来设定两个定时器SetTimer hwnd, TIMER_SEC, 1000, NULL ;SetTimer hwnd, TIMER_MIN, 60000, NULL ;WM_TIMER 的处理如下所示caseWM_TIMERswitch wParam{case TIMER_SEC//每秒一次的处理break ;case TIMER_MIN//每分钟一次的处理break ;}return 0 ;如果您想将一个已经存在的定时器设定为不同的时间间隔,您可以简单地用不同的时间值再次呼叫SetTimer。在时钟程序里,如果显示秒或不显示秒是可以选择的,您就可以这样做,只需简单地将时间间隔在 1000 毫秒和 60 000 毫秒间切换就可以了。程序 8-1 显示了一个使用定时器的简单程序,名为BEEPER1,定时器的时间间隔设定为 1 秒。当它收到WM_TIMER 消息时,它将显示区域的颜色由蓝色变为红色或由红色变为蓝色,并通过呼叫 MessageBeep 函数发出响声。(虽然 MessageBeep 通常用于MessageBox,但它确实是一个全功能的鸣叫函数。在有声卡的 PC 机上,一般可以使用不同的 MB_ICON 参数作为 MessageBeep 的一个参数以用于
展开阅读全文
收藏
下载资源

加入会员免费下载





足球比分直播