为什么setTimer不起作用?

时间:2013-03-14 10:10:40

标签: c visual-studio-2010 winapi timer

我有以下程序。我想知道setTimer是如何运作的。所以,我写了一个程序,但无法理解为什么TimerProc函数没有被调用。为什么?还需要做什么才能触发setTimer / TimerProc。请帮忙。

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

VOID CALLBACK TimerProc(
    HWND hwnd,  // handle of window for timer messages 
    UINT uMsg,  // WM_TIMER message
    UINT idEvent,   // timer identifier
    DWORD dwTime    // current system time
   ) {
      printf("from callback\n");

   }
int main(int argc, char *argv[])
{
   UINT timerid = SetTimer(NULL,1,1000,TimerProc);/*changed the time from 1 to 1000, but no effect*/
   printf("timerid %d\n",timerid); 
   int i,j;

      //delay loop, waiting for the callback function to be called
   for(j=0;j<0xffffffff;j++);
   /*{
   printf("%d\n", j);
   }*/

   printf("done \n");
  system("PAUSE");  
  return 0;
}

4 个答案:

答案 0 :(得分:4)

计时器通过Windows消息队列工作,你有一个控制台应用程序。

如果您创建一个基本的Win32应用程序,以便获得一个窗口和一个消息循环,当DefWndProc()调用捕获WM_TIMER消息时,它将执行回调。当然你也可以自己陷阱WM_TIMER。

答案 1 :(得分:3)

您需要学习消息循环范例。您正在尝试使用Win32 api而不实际执行正确的Win32初始化和操作。

如果您来自Posix,您可以使用SIGALRM并发出警报。

在Windows上,我担心你还有更多工作要做(比如启动一个消息循环,因为即使你提供了一个回调函数,你需要一个消息循环泵,它调用默认的消息循环处理函数会调用你的计时器的回调,检查这个: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644906(v=vs.85).aspx

  

应用程序可以通过在中包含WM_TIMER case语句来处理WM_TIMER消息   窗口过程或在创建定时器时指定TimerProc回调函数。   指定TimerProc回调函数时,默认窗口过程调用   处理WM_TIMER时的回调函数。因此,您需要在中发送消息   调用线程,即使你使用TimerProc而不是处理WM_TIMER。

答案 2 :(得分:3)

SetTimer文档说: *指定TimerProc回调函数时,默认窗口过程在处理WM_TIMER时调用回调函数。因此,您需要在调用线程中调度消息,即使您使用TimerProc而不是处理WM_TIMER。*

相反,你需要延迟循环:

bool bStillBusy = false;


int main()
{

MSG msg;

bStillBusy  = true;

id = SetTimer(NULL, 0, 3000, (TIMERPROC) TimerProc);

while(bStillBusy) 
{
  GetMessage(&msg, NULL, 0, 0);
  DispatchMessage(&msg);
}
...
etc.
}

然后在回调中将bStillBusy设置为'false'。

答案 3 :(得分:2)

使用普通的Windows事件系统处理计时器,因此您需要一个正常的事件循环。