1

我有以下程序。我想知道如何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

4 回答 4

4

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

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

于 2013-03-14T10:14:08.227 回答
3

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

如果您来自 Posix,则可以使用 SIGALRM 和警报。

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

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

于 2013-03-14T10:18:07.673 回答
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”。

于 2013-03-14T10:20:25.457 回答
2

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

于 2013-03-14T10:15:41.257 回答