《Windows程序设计》读书笔记之八

本文详细介绍了Windows计时器的工作原理及其使用方法。包括如何利用SetTimer函数创建计时器,KillTimer函数停止计时器,以及如何处理WM_TIMER消息等关键信息。此外,文中还解释了不同Windows版本下计时器的分辨率差异。
计时器
                                                                                    见钱眼开 于2005-5-4
       Windows计时器是一种输入设备,周期性的每经过一个指定的时间间隔就通知应用程序一次。你的程序将时间间隔告诉Windows,然后Windows给您的程序周期性发生的WM_TIMER消息以表示时间到了。
       很多重要的软件功能都是通过计时器实现的。例如,系统时钟就是个最典型的例子。
       使用SetTimer函数实现分配一个计时器。可设定的时间间隔可以是1-232毫秒(将近50天)之间的任何值。调用KillTimer函数结束使用一个计时器。
       Windows计时器是PC的硬件和ROM BIOS构造的计时器逻辑的一种相对简单的扩展。DOS时代,应用程序一般都是通过捕获BIOS中断来实现时钟或计时器,这些中断每54.915毫秒产生一次。而Windows应用程序不需要捕获BIOS中断,Windows本身处理硬件中断。Windows为每个应用程序的计时器保存一个计数,当计数减少为0时,Windows在相应的应用程序消息队列中放置一个WM_TIMER消息,并将计数恢复为初始值。
       Windows98中,计时器与潜在的PC计时器一样具有55毫秒的分辨率。在Windows NT中,计时器的分辨率为10毫秒。Windows应用程序不可能以高于这一分辨率的速率接收WM_TIMER消息。在SetTimer中指定的时间间隔总是截尾为时钟嘀嗒的整数倍。例如,1000毫秒的间隔除以54.925毫秒,得到18.207个时钟嘀嗒,截尾后为18个时钟嘀嗒,它实际上是989毫秒。对于小于55毫秒的间隔。每个时钟嘀嗒都产生一个WM_TIMER消息。
       计时器是基于硬件计时器中断的,但是Windows程序却并非以异步的方式中断处理WM_TIMER消息。WM_TIMER消息被放置在消息队列,和其他消息一起参加排序。而且,Windows对于WM_TIEMR消息的处理类似于WM_PAINT消息,都是低优先级的,只有在消息队列中没有其他消息时才接收它们。WM_TIEMR消息和WM_PAINT消息还有一点相同,Windows不会连续向消息队列放置多个WM_TIMER消息,总是将多余的WM_TIMER消息合成一个消息
       WM_TIMER消息wParam参数代表计时器IDlParam参数包含SetTimer函数lpTimerFunc参数中指定的计时器回调函数指针,如果未设置回调函数,则该参数值为0
    SetTimer函数声明原型:
    UINT_PTR SetTimer(       
        HWND hWnd,              //拥有该计时器的窗口句柄
        UINT_PTR nIDEvent,      //计时器ID
        UINT uElapse,           //时间间隔
        TIMERPROC lpTimerFunc   //计时器回调函数指针
    );
    TIMERPROC指向函数原型:
    void CALLBACK TimerProc(
              HWND hwnd,                      //目标窗口句柄
              UINT message,                    //WM_TIMER
              UINT iTimerID,                   //计时器ID
              DWORD dwTime,               //自系统启动后所经过的毫秒数,由GetTickCount返回
       );
       计时器使用的三种方法:
a)         指定窗口句柄、计时器ID、时间间隔,设置计时器回调函数指针值为NULL。在窗口过程中处理WM_TIMER消息。
SetTimer(hwnd,Timer_ID,1000,NULL);
b)        指定窗口句柄、计时器ID、时间间隔、回调函数。直接由回调函数而不是窗口过程处理WM_TIMER消息。
SetTimer(hwnd,Timer_ID,1000,TimerProc);     
c)        设置窗口句柄为NULL,忽略计时器ID,指定时间间隔、回调函数,返回一个计时器ID如果没有可用的计时器,那么返回值为NULL
UINT uiTimerID = SetTimer(NULL,0,1000,TimerProc);   
如果修改一个计时器的时间间隔,设置新的时间间隔后再次调用SetTimer函数即可。
       GetSystemTime函数返回当前的世界时间;GetLocalTime函数返回当地时间,取决于计算机位于的时区。它们返回的时间指针都指向一个SYSTEMTIME结构,其原型声明如下:
typedef struct _SYSTEMTIME {
 WORD wYear;
 WORD wMonth;
 WORD wDayOfWeek; //Sunday = 0, Monday = 1, and so on
 WORD wDay;
 WORD wHour;
 WORD wMinute;
 WORD wSecond;
 WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值