我需要在我的VC ++应用程序创建定时器,在这里我需要设置计时器,并在计时器超时后,我需要调用一个具体的方法...
我已经看到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建议,如果有任何替代做到这一点。
谢谢。
使用可等待计时器。 经过时间由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;
}
我不检查错误,你应该。
从代码片段我敢肯定你在编写基于控制台应用程序。
您可以使用定时器的其他类型,或者你是不是真的关心有关精度有你,为了使该定时器的工作错过了一两件事。
虽然这是一个控制台应用程序,你的计时器回调不会,除非你派定时器消息调用。 做这个:
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();
考虑使用可等待计时器。
那么,它看起来不错我。 你有没有在你的程序中的TimerProc设置断点,并在您调用SetTimer的? 你需要确定你真的叫的SetTimer和的TimerProc是不是真的被调用。
接下来的事情我会问的是你是否在消息循环调度消息? 如果您没有在消息循环调度的消息,我不认为定时器消息将永远不会被解雇。 如果您在程序中执行一些长期的过程,你永远不会调用的GetMessage / PeakMessage具有相应的在DispatchMessage那么这可能导致定时器消息从未被炒鱿鱼。
这条经过创建和销毁计时器。
我发现了一些示例代码 ,它仍然采用一个HWND,没有任何理由,为什么你不使用hWnd参数? 如果你不能用一个,你可以试试,看看当你在NULL传递代码工作。 我在示例中注意到他们投回调到TIMERPROC
。