定时器的使用

12个函数SetTimerKillTimer

<1>通过调用SetTimer函数为Windows程序分配一个定时器,SetTimer有一个时间间隔范围为1毫秒到4,294,967,295毫秒(将近50天)的整数型态参数,这个值指示Windows每隔多久时间给您的程序发送WM_TIMER消息。例如,如果间隔为1000毫秒,那么Windows将每秒给程序发送一个WM_TIMER消息。

<2>当程序用完定时器时,它调用KillTimer函数来停止定时器消息。在处理WM_TIMER消息时,可以通过调用KillTimer函数来编写一个限用一次的定时器。KillTimer调用清除消息队列中尚未被处理的WM_TIMER消息,从而使程序在调用KillTimer之后就不会再接收到WM_TIMER消息。

2.定时器使用的三种方法

<1> WM_TIMER消息发送到通常的窗口消息处理程序,在窗口消息处理程序WndProc中处理

   SetTimer (hwnd, 1, uiMsecInterval, NULL) ;

   第一个参数是其窗口消息处理程序将接收WM_TIMER消息的窗口代号。第二个参数是定时器ID,它是一个非0数值,在整个例子中假定为1。第三个参数是一个32位无正负号整数,以毫秒为单位指定一个时间间隔,一个60,000的值将使Windows每分钟发送一次WM_TIMER消息。

  在任何时刻停止WM_TIMER消息(即使正在处理WM_TIMER消息)。此函数的第二个参数是SetTimer调用中所用的同一个定时器ID。在终止程序之前,您应该响应WM_DESTROY消息停止任何活动的定时器。

可以通过:KillTimer (hwnd, 1) ;停止该定时器

   注意这里也可以这样来使用。

   UINT  myTimer;

#define ID_TIMER 1

   WM_CREATE消息处理中你可以这样:

  myTimer=setTimer(hwnd, ID_TIMER,1000,NULL);// setTimer返回定时器标识,类型为UINT

  如果在一般情况下整个程序定时器都要有效,那么你应该在收到WM_DESTROY消息停止定时器。

  那么在停止该定时器时可以这样:

  KillTimer(hwnd, ID_TIMER);

  如果你要这样写也是对的

  KillTimer(hwnd, myTimer);

  下面再谈谈WM_TIMER消息的处理,很明显当你设置了定时器以后你就可以收到WM_TIMER消息,当您的窗口消息处理程序收到一个WM_TIMER消息时,wParam参数等于定时器的ID值(上述情形为1),lParam参数为0。如果需要设定多个定时器,那么对每个定时器都使用不同的定时器IDwParam的值将随传递到窗口消息处理程序的WM_TIMER消息的不同而不同。为了使程序更具有可读性,您可以使用#define叙述定义不同的定时器ID

#define WORLF_RUN_TIMER 1

   #define RABBIT_MOVE_TIMER 2

  然后您可以使用两个SetTimer调用来设定两个定时器:

  SetTimer(hwnd, WORLF_RUN_TIMER,1000,NULL);

  SetTimer(hwnd, RABBIT_MOVE_TIMER,25000,NULL);

WM_TIMER的处理如下所示:

case WM_TIMER:

      switch(wParam)

{

   case WORLF_RUN_TIMER:

//处理狼奔跑的定时器消息

break;

case RABBIT_MOVE_TIMER:

//处理兔子移动的定时器消息

break;

}

return  0;

注意当整个应用程序只有一个定时器时,您不需要做判断ID确定是哪个定时器的,您可以直接在WM_TIMER消息处理中写您的处理代码。

<2>Windows直接将定时器消息发送给您程序的另一个CALLBACK函数

把以下的callback函数称为TimerProc(您能够选择与其它一些用语不会发生冲突的任何名称),它只处理WM_TIMER消息:

VOID CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
        处理WM_TIMER消息
}

记住在定义该函数前不要忘记声明它。

TimerProc的参数hwnd是在调用SetTimer时指定的窗口代号。Windows只把WM_TIMER消息送给TimerProc,因此消息参数总是等于WM_TIMERiTimerID值是定时器IDdwTimer值是与从GetTickCount函数的传回值相容的值。这是自Windows启动后所经过的毫秒数。

很容易的我们可以想到,在这种方法中我们不能再简单的把SetTimer的第4个参数设为NULL,它应该是对应处理定时器消息的CALLBACK函数的地址。

SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;

<3>一系列定时器,不需要跟踪ID的情况下,同样使用callback函数处理

   设定定时器的第三种方法类似于第二种方法,只是传递给SetTimerhwnd参数被设定为NULL,并且第二个参数(通常为定时器ID)被忽略了,最后,此函数传回定时器ID

  UNIT  iTimerID = SetTimer (NULL, 0, wMsecInterval, TimerProc) ;

  如果没有可用的定时器,那么从SetTimer传回的iTimerID值将为NULL

  KillTimer的第一个参数(通常是窗口代号)也必须为NULL,定时器ID必须是SetTimer的传回值:

KillTimer(NULL,iTimerID);

传递给TimerProc定时器函数的hwnd参数也必须是NULL。这种设定定时器的方法很少被使用。如果在您的程序在不同时刻有一系列的SetTimer调用,而又不希望追踪您已经用过了那些定时器ID,那么使用此方法是很方便的。

  参考文献:Programming Windows Fifth Edition
International Programming for Microsoft® Windows®Introductiing Microsoft .NET

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值