我需要在我的VC ++应用程序中创建Timer,在那里我需要设置定时器和定时器的超时,我需要调用一个特定的方法......
我已经看过msdn论坛,并在下面的代码中完成了这项工作
SetTimer(NULL,1,5*1000,TimerProc);
我的TimerProc
方法如下
void CALLBACK TimerProc(HWND aHwnd, UINT aMessage, UINT_PTR aTimerId, DWORD aTime)
{
StopProceess();
}
我假设5秒后SetTimer
应调用TimerProc
方法,但永远不会调用它。不知道我在做错了什么。或者PLZ建议是否有其他选择。
感谢。
答案 0 :(得分:2)
从代码片段中我非常确定您正在编写基于控制台的应用程序。
你可以使用其他类型的计时器,或者如果你并不真正关心精确度,那么为了让这个计时器工作,你有一件事是错过的。
即使这是一个控制台应用程序,除非您调度计时器消息,否则不会调用您的计时器回调。 这样做:
MSG msg;
SetTimer(NULL, 1, 5*1000 ,TimerProc);
while (GetMessage(&msg, NULL, WM_NULL, WM_TIMER))
{
DispatchMessage(&msg);
if (WM_TIMER == msg.message)
{
break;
}
}
StopProceess();
考虑使用Waitable Timer。
答案 1 :(得分:1)
嗯,我觉得好看。您是否在TimerProc中的程序中设置了断点以及调用SetTimer的位置?你需要确定你真的调用了SetTimer并且没有真正调用TimerProc。
接下来我要问的是你是否在消息循环中调度消息?如果您没有在消息循环中调度消息,我认为定时器消息永远不会被触发。如果在程序中执行一些长进程并且从不使用相应的DispatchMessage调用GetMessage / PeakMessage,那么这可能会导致计时器消息永远不会被触发。
答案 2 :(得分:0)
此article会创建并销毁计时器。
我找到了一些仍然使用hWnd的example code,你有没有理由不使用hWnd参数?如果您不能使用它,您可以尝试查看传入NULL时代码是否有效。我在示例中注意到他们将回调转换为TIMERPROC
。
答案 3 :(得分:0)
使用等待计时器。在第5个参数设置的时间之后调用回调,并重复每个第6个参数。 经过一段时间后,调用回调,执行一些处理并设置事件以允许退出
// ConsoleTimer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#define TIME_LAPS 5 * 1000
HANDLE g_hExitEvent = NULL;
void CALLBACK WaitOrTimerCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired)
{
Sleep(5000); // fake long processing
SetEvent(g_hExitEvent);
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hNewTimer = NULL; //call after
BOOL IsCreated = CreateTimerQueueTimer(&hNewTimer, NULL, WaitOrTimerCallback, NULL, TIME_LAPS,
// repeat
TIME_LAPS, WT_EXECUTELONGFUNCTION);
g_hExitEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
WaitForSingleObject(g_hExitEvent, 15000);
DeleteTimerQueueTimer(NULL, hNewTimer, NULL);
return 0;
}
我不会检查错误,你应该。