在VC ++ SetTimer的(SetTimer in VC++)

2019-09-17 10:10发布

我需要在我的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建议,如果有任何替代做到这一点。

谢谢。

Answer 1:

使用可等待计时器。 经过时间由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;
}

我不检查错误,你应该。



Answer 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();

考虑使用可等待计时器。



Answer 3:

那么,它看起来不错我。 你有没有在你的程序中的TimerProc设置断点,并在您调用SetTimer的? 你需要确定你真的叫的SetTimer和的TimerProc是不是真的被调用。

接下来的事情我会问的是你是否在消息循环调度消息? 如果您没有在消息循环调度的消息,我不认为定时器消息将永远不会被解雇。 如果您在程序中执行一些长期的过程,你永远不会调用的GetMessage / PeakMessage具有相应的在DispatchMessage那么这可能导致定时器消息从未被炒鱿鱼。



Answer 4:

这条经过创建和销毁计时器。

我发现了一些示例代码 ,它仍然采用一个HWND,没有任何理由,为什么你不使用hWnd参数? 如果你不能用一个,你可以试试,看看当你在NULL传递代码工作。 我在示例中注意到他们投回调到TIMERPROC



文章来源: SetTimer in VC++