代码如下:
ULONG i=0;
char buffer[32]="";
void CALLBACK TimerFunc(HWND handle,ULONG uMsg,ULONG timerid,DWORD timecount)

i++;
wsprintf(buffer,"%d",i);
MessageBox(NULL,buffer,NULL,MB_OK);
}void TestSetTimer()
{
   ULONG TimerID=SetTimer(NULL,0,1000,(TIMERPROC)TimerFunc);
  if(TimerID==0)
  {
  MessageBox(NULL,"SetTimer error",NULL,MB_OK);
  //return FALSE;
  }
}问题:
1.回调函数里不会执行弹出窗口。而主函数改成if(TimerID!=0)时,会正常每1秒弹出一个窗口。
这个怎么解释?
2.怎么才能让回调函数正常执行?

解决方案 »

  1.   

    干嘛要做成回调呢,普通函数不行吗?
    TimerID!=0  显然是真啊,就可以执行0为假,其它为真,包括负数。
      

  2.   

    原因是:MessageBox(NULL,buffer,NULL,MB_OK)弹出的是模态对话框,当其出现时,线程处于堵塞状态,在手动关闭该模态对话框之前,无法继续响应Timer事件。
    解决方法:用非模态对话框Create
      

  3.   

    void CALLBACK TimerFunc(HWND handle,ULONG uMsg,ULONG timerid,DWORD timecount)

            i++;
    wsprintf(buffer,"%d",i);
    WritePrivateProfileString("APP","Key",buffer,"testini");
    }void TestSetTimer()
    {
     ULONG TimerID=SetTimer(NULL,0,1000,(TIMERPROC)TimerFunc);
    }问题不在这。简化后,发现回调函数根本就没有执行。
      

  4.   

    ULONG TimerID=SetTimer(NULL,1,1000,(TIMERPROC)TimerFunc);
      

  5.   

    如果第1个参数为NULL,那第2个参数是忽略的
      

  6.   

    console程序?没消息循环DispatchMessage回调函数是不会被调用的
      

  7.   

    !=0你弹出的应该是MessageBox(NULL,"SetTimer error",NULL,MB_OK);这个吧?
      

  8.   

    void CALLBACK TimerFunc(HWND handle,ULONG uMsg,ULONG timerid,DWORD timecount)

            i++;
    wsprintf(buffer,"%d",i);
    WritePrivateProfileString("APP","Key",buffer,"testini");
    }void TestSetTimer()
    {
     ULONG TimerID=SetTimer(NULL,0,1000,(TIMERPROC)TimerFunc);
    }问题不在这。简化后,发现回调函数根本就没有执行。第一步必须知道SetTimer是否成功,没有成功,设断点,watch里输入@err,hr,看看GetLastError的结果。
      

  9.   

    SetTimer总是通过WM_TIMER消息来完成工作的,所以你必须确保你的程序中有消息循环。
      

  10.   

    孙鑫mfc视频中有讲到,不记得是第三讲还是第四讲了
      

  11.   

    用多媒体定时器 timeSetEvent 可以不用消息机制
     
      

  12.   

    在TimerFunc里设个断点跟进去 看看有没有 执行 还是框子的问题 
      

  13.   

    通常调试代码,最好不要用MESSAGEBOX。
    可以用MFC的TRACE
    如果不是MFC可以用 OutDebugString