3

我尝试使用SetTimerAPI 每 X 分钟调用一次函数。所以,我写了这个测试代码

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

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

4

3 回答 3

19

你的程序有几个问题:

  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;
    }
    

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

于 2013-03-28T15:06:15.923 回答
1

我发现最好的实现如下:

#define TIMER1 1001
#define TIMER2 1002


    SetTimer(hWndMainWnd,             // handle to main window 
        TIMER1,            // timer identifier 
        1000, 
        NULL);     // no timer callback 

    SetTimer(hWndMainWnd,             // handle to main window 
        TIMER2,            // timer identifier 
        5000, 
        NULL);     // no timer callback 

然后,作为主事件循环的一部分:

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_TIMER:
        if (wParam == TIMER1)
        {
              // do something1
        }
        else
        if (wParam == TIMER2)
        {
             // do smoething2
        }
        break;
于 2017-09-10T21:21:52.903 回答
0

这可以编译和运行:

#include <stdio.h>
#include <windows.h>

void CALLBACK f(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime)
{
    printf("Hello\n");
}

int main()
{
    MSG msg;

    SetTimer(NULL, 0, 1000 * 3, (TIMERPROC)& f);
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}
于 2019-11-19T13:57:52.717 回答