自己写的类,怎么样用 settimer()定时器...
我的类,没有从任何基类继承.......
我该怎么做??......................
谢谢提供资料和方法..................

解决方案 »

  1.   

    UINT_PTR SetTimer(          HWND hWnd,
        UINT_PTR nIDEvent,
        UINT uElapse,
        TIMERPROC lpTimerFunc
    );SetTimer(NULL,1,1000,TimerProc)
    写个static的成员函数TimerProc
    VOID static CALLBACK TimerProc(          HWND hwnd,
        UINT uMsg,
        UINT_PTR idEvent,
        DWORD dwTime
    );
      

  2.   

    SetTimer(NULL,1,1000,TimerProc)
    如楼上所说,使用这种方式,就不需要再去定义消息映射了,在一定时间内,会自动调用你的回调函数。
    你只需要把处理代码放在回调函数里面即可。
      

  3.   

    同意 DentistryDoctor
    回调函数会是程序的逻辑性比较强,比在CWnd里头的OnTimer看着舒服一些
      

  4.   

    因为你的类不是从CWnd/CWinThread派生的,所以无法使用消息映射。
      

  5.   

    同意楼上的,CWnd::OnTimer也是通过回调实现的接口
      

  6.   

    WM_TIMER消息处理需要窗口过程的支持,如果程序没用到窗口的话,至少该手工调用DispatchMessage.
    CCmdTarget派生的类才支持消息映射.不想派生的话,用API:  ::SetTiemr
      

  7.   

    启动一个线程LRESULT Thread_Process(void)
    {
        while(1)
       {
          Sleep(3000);
          DoYouSelf();
       }
    }一样完成定时器功能。
    如果程序中定时器修改的数据是和另外线程共有的,请不要用系统提供的OnTimer处理,否则容易发生死锁现象,还是用自己写的定时程序好。
      

  8.   

    void CALLBACK OnTimer(***********)SetTimer(***)
      

  9.   

    void CALLBACK OnTimer(***********)
    放在CPP文件头上要定义一下
      

  10.   

    DentistryDoctor(雅克医生(潜心修内功)) 说的好!
      

  11.   

    回调函数也只能是有WM_TIMER时候调用你指定的函数而已,但是要想接收消息,就必须有窗口句柄吧!
    1. 可以在你的类里建一个隐藏的窗口,仅仅接收WM_TIMER消息.
    2. 自己写也可以实现,不过比较复杂,大致思路如下:
       建立一个定时器表,大致结构如下:
    struct _tagTimerTableItem
    {
         int   nTick ;   //已经记数的时间长度 >= nInterval是调用 pfnTimerProc
         int   nTimerID;//时间ID  注意必须唯一
         uint  nInterval; //时间间隔
         void (*pfnTimerProc )();//一个指向你的时间到处理函数的 函数指针
    }TIMETABLEITEM;
    TIMETABLEITEM timetable[100];//100不够再加,或者改成动态数组也行
    memset(timetable, 0, sizeof(timetable));定义你的SetTimer函数:
    SetTimer(int nTimerID, uint, nInterval, void (CALLBACK *lpfnTimerProc(void )) 
    {
        //先查找时间表里有没有ID=nTimerID的项,有就修改其参数,
        //没有就找一个timetable[nTimeTableItemIndex].nTimerID=0的项,修改其参数为:
        timetable[nTimeTableItemIndex].nTick = 0;
        timetable[nTimeTableItemIndex].nTimerID = nTimerID;
        timetable[nTimeTableItemIndex].nInterval= nInterval;
        timetable[nTimeTableItemIndex].pfnTimerProc = lpfnTimerProc;
    }
    KillTimer(int nTimerID);
    {
        //先查找时间表里有没有ID=nTimerID的项,有就
        memset(&timetable[nTimeTableItemIndex], 0, sizeof(timetable[nTimeTableItemIndex]);
    }
       建立一个线程,以一个比较小的时间单位为间隔(比如说1ms),查询
    void timerthread(void *lpvoid)
    {
        int i= 0 ;
        while(WaitForSingleObject(hEnentExit, 1)== Wait_timeout)
        {
            for( i = 0 ;i < 100; i ++ )
            {
                if ( timetable[i].nTimerID==0)
                     continue;
                timetable[i].nTick ++ ;
                if ( timetable[i].nTick >= timetable[i].nInterval )
                {
                      timetable[i].nTick = 0 ;
                      timetable[i].pfnTimerProc();
                }
            }
        }
    }如果考虑周详点,可以对timetalbe加上互斥锁.
    大致思路就是这样了可以不用窗口句柄,但要注意timetable里的nTimerID须互不相同,因为用它来区分不同的类