VC ++中的SetTimer

时间:2012-05-23 07:44:54

标签: visual-studio-2010 visual-c++ timer

我需要在我的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建议是否有其他选择。

感谢。

4 个答案:

答案 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;
}

我不会检查错误,你应该。