windows计时器是一种输入设备,每隔指定时间都会产生一个消息WM_TIMER,消息被放在应用程序消息队列中。WM_TIMER消息的产生不像DOS系统一样通过截获时钟滴答的BIOS中断来实现的,而是设定一个数值,每一个时钟滴答,该值减一,直到为零,产生一个WM_TIMER消息。在windows 98上,计时器具有与底层计时器相同的55毫秒的周期,也就是说没55毫秒产生一个时钟滴答,而windows NT上,其为10毫秒。例如:当windows 98上设置的时钟间隔为1000毫秒时,也就是说讲18个时钟滴答产生一个计时器消息(WM_TIMER). 值得注意的是,当设置的时钟周期小于系统时钟滴答时,每个时钟滴答(55毫秒)都将产生一个计时器消息。
注:在同一时刻只能有一个WM_TIMER消息在消息队列中,且其优先级比较低。
使用计时器的三种方法:
方法一:
SetTimer(hwnd,iTimerID,uniMescIerval,NULL);//产生计时器消息,并指定接受消息
第一个参数:其为接受计时器消息的窗口句柄。
第二个参数:其为计时器的ID,不能为0,不同计时器不同
第三个参数:时间间隔
KillTimer(hwnd,iTimerID);//停止产生计时器消息
其中第二个参数的值要与产生计时器的消息的计时器ID相同。
注:当需改变一个计时器的时间间隔时,可以再次调用WM_TIMER消息。
方法二:
可以在SetTimer函数中指定接受计时器消息的“回调”函数。
SetTimer(hwnd,iTimerID,iMsecInterval,TimerProc);
第一,二,三个参数与方法一相同,第四个参数为指定回调函数的函数名。
回调函数的格式:
VOID CALLBACK TimerProc(HWND hwnd, UINT message,UINT iTimerID,DWORD dwTime)
{
[处理过程]
}//dwTimer是GetTickCount函数返回值,其记录了自从windows启动到现在已逝去的毫秒
KillTimer(hwnd,iTimerID);
方法三:
iTimerID=SetTimer(NULL,0,wMsecInterval,TimerProc);
如果iTimerID为0,表示没有计时器可以用。
KillTimer(NULL,iTimerID);
该方法很少用到。如果在程序中,需要在不同时刻调用多次SetTimer,但又不想记录那些计时器ID已经被使用过,那么这种方法可能会派上用场。
获取时间:
typedef struct _SYSTEMTIME
{
WORD wYear;
WORD wHour;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
}SYSTEMTIME,*PSYSTEMTIME;
其主要用于GetSystemTime(格林威治时间)和GetLocalTime(当地时间)函数。