如何使用SetTimer API

use*_*913 2 c++ windows api

我尝试SetTimer每隔X分钟使用API来调用一个函数.所以,我写了这个测试代码

void f()
{
 printf("Hello");
}
int main() 
{
 SetTimer(NULL, 0, 1000*60,(TIMERPROC) &f); 
}
Run Code Online (Sandbox Code Playgroud)

我应该每分钟都写好,但它不起作用.

mit*_*ity 16

您的计划几乎没有问题:

  1. C程序在离开时会结束,main()因此没有时间可以发生计时器.
  2. Win32计时器需要消息泵(见下文)才能正常工作,因为它们是通过WM_TIMER消息实现的,即使它们与任何窗口没有关联,也提供了函数回调.

    指定TimerProc回调函数时,默认窗口过程在处理WM_TIMER时调用回调函数.因此,即使使用TimerProc而不是处理WM_TIMER,也需要在调用线程中调度消息.

    来源:MSDN:SetTimer函数

  3. 回调函数有坏原型.请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms644907%28v=vs.85%29.aspx

    void CALLBACK f(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime)
    {
      printf("Hello");
    }
    
    int main() 
    {
      MSG msg;
    
      SetTimer(NULL, 0, 1000*60,(TIMERPROC) &f);
      while(GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
    
      return 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)

(注意这个示例程序永远不会结束,相反,真正的程序应该有一些额外的逻辑来通过发送WM_QUIT).