zoukankan      html  css  js  c++  java
  • C++ 定时器使用

    用WM_TIMER来设置定时器 


    先请看SetTimer这个API函数的原型 
    UINT_PTR   SetTimer( 
    HWND   hWnd,   // 窗口句柄 
    UINT_PTR   nIDEvent,   // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器 
    UINT   uElapse,   // 时间间隔,单位为毫秒 
    TIMERPROC   lpTimerFunc   // 回调函数 
    ); 
    例如 
    SetTimer(m_hWnd,1,1000,NULL);   //一个1秒触发一次的定时器 
    在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了,例如: 
    UINT   SetTimer(1,100,NULL); 
    第一个参数值1,表示此定时器的ID号。 
    第二个参数表示要等待100毫秒时间再重新处理一次。第三个参数在这种方法中一般用NULL。 

    注意:设置第二个参数时要注意,如果设置的等待时间比处理时间短,程序就会出问题了。 


    调用回调函数 

    此方法首先写一个如下格式的回调函数 
    void   CALLBACK   TimerProc(HWND   hWnd,UINT   nMsg,UINT   nTimerid,DWORD   dwTime); 
    然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。 

    多个定时器的实现与应用 

    我们在安装定时器时都为其指定了ID,使用多个定时器时,该ID就发挥作用了。 不使用MFC时,当接收到WM_TIMER消息,WPARAM   wParam中的值便是该定时器的ID。使用MFC时就更简单了,我们为其增加WM_TIME的消息处理函数OnTimer即可,请看如下例子 
    void CTimerTestDlg::OnTimer(UINT   nIDEvent) 
    { 
        switch(nIDEvent) 
        { 
        case   24:   ///处理ID为24的定时器 
            Draw1(); 
            break; 
        case   25:   ///处理ID为25的定时器 
            Draw2(); 
            break; 
        } 
        CDialog::OnTimer(nIDEvent); 
    } 
    当你用回调函数时,我们可以根据nTimerid的值来判断是哪个定时器,例如: 
    void CALLBACK TimerProc(HWND hWnd
                            , UINT nMsg
                            , UINT nTimerid
                            , DWORD dwTime) 
    { 
        switch(nTimerid) 
        { 
        case   1:   ///处理ID为1的定时器 
            Do1(); 
            break; 
        case   2:   ///处理ID为2的定时器 
            Do2(); 
            break; 
        } 
    } 


    取消定时器 

    不再使用定时器后,我们应该调用KillTimer来取消定时,KillTimer的原型如下 
    BOOL   KillTimer( 
                     HWND   hWnd,   //   窗口句柄 
                     UINT_PTR   uIDEvent   //   ID 
    ); 

    在MFC程序中我们可以直接调用KillTimer(int   nIDEvent)来取消定时器。

    实例如下

    #include <windows.h> 
    #include <iostream> 
    #include <time.h>
    
    VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) 
    { 
        time_t now_time;
        now_time = time(NULL);
        struct tm *tblock;
        tblock = localtime(&now_time);
        printf("Local time is: %s",asctime(tblock));  
    } 
    
    void   main() 
    { 
        int   timer1   =   100; 
        HWND   hwndTimer;       
        MSG   msg;                     
    
        SetTimer(NULL,timer1,5000,TimerProc); 
        int   itemp; 
        while ( (itemp = GetMessage(&msg, NULL,NULL,NULL))&& (itemp!=0) &&  (-1 !=  itemp)) 
        {   
            if   (msg.message   ==   WM_TIMER)   
            {   
                printf("I got the message.\n"); 
                TranslateMessage(&msg);   
                DispatchMessage(&msg);     
            }   
        }   
    } 
    转自:http://blog.163.com/linzuxin@126/blog/static/340740572008101311552948/ (向原作者致敬)

  • 相关阅读:
    LVM
    linux在线添加硬盘、扫盘
    django 的用户认证组件
    django组件-cookie与session
    django组件 分页器
    Django 与 Ajax
    Djange 模型层2
    Django 模型层
    Djange 的模板层
    Django的视图层
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207101.html
Copyright © 2011-2022 走看看