我有以下程序。我想知道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;
}
答案 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事件系统处理计时器,因此您需要一个正常的事件循环。