Windows编程:计时器消息的处理、销毁计时器

计时器消息的处理


       (1)当不使用回调函数时
            当不使用回调函数时程序会收到 WM_TIMER 消息, 这时只要像处理普通消息一样处理 WM_TIMER 消息就行了, 如果有多个计时器, 可以从 wParam 参数中根据计时器的ID作不同的处理, 例如:
     case WM_TIMER:
                switch(wParam)
                {
                    case 1:
                        [处理ID为1的计时器]
                        break;
                    case 2:
                        [处理ID为2的计时器]
                        break ;
                    ...
                }
                return 0 ;
     
        (2)使用回调函数的计时器
            当计时器创建时指定好回调函数时, 回调函数可以像下面的写法进行:
     VOID CALLBACK TimerProc( HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime )
     {
            [处理 WM_TIMER 消息]
     }         

            当不同的计时器使用同一个回调函数时, 可以根据回调函数的 iTimerID 参数来区分不同的计时器

例如:     

  switch(iTimerID)
           {
            case 1:         //处理ID为1的定时器
                 [...]
                 break;
            case 2:         //处理ID为2的定时器
                 [...]
                 break;
            ...
           }


                

销毁计时器


        在开始部分也已经说了, Windows的计时器属于系统资源, 在使用完毕后应及时销毁。销毁计时器的函数是 KillTimer, 他的函数原型如下:
        BOOL KillTimer(
            HWND hWnd,            //窗口句柄
            UINT_PTR uIDEvent    //计时器ID
        );

        要销毁一个计时器, 必须知道该计时器的ID, 所以保留计时器的ID也是十分重要的, 你可以在任何时候销毁一个已经创建的计时器, 包括在处理计时器消息时。 最好在程序退出之前销毁完所有的已创建的计时器, 一个不错的办法是在处理 WM_DESTROY 消息时对于那些没有销毁的全部进行销毁。

        需要注意的是, 当成功销毁一个计时器后, 该计时器所产生的 WM_TIMER 消息并不会从消息队列中移除, 如果消息队列中还有没有处理的 WM_TIMER 消息, 那么即使销毁了该计时器, 应用程序还是会有可能处理到没有处理完的 WM_TIMER 消息。

你可能感兴趣的:(Windows编程)