定时器的使用

    技术2022-05-11  79

    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 EditionInternational Programming for Microsoft® Windows®Introductiing Microsoft .NET


    最新回复(0)