1

我需要在我的 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方法,但它永远不会被调用。不知道我在这做错了什么。或请建议是否有其他选择。

谢谢。

4

4 回答 4

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

考虑使用等待定时器。

于 2012-05-23T22:57:25.340 回答
1

嗯,在我看来没问题。您是否在 TimerProc 和调用 SetTimer 的程序中设置断点?您需要确保您确实调用了 SetTimer 并且没有真正调用 TimerProc。

接下来我要问的是您是否在消息循环中发送消息?如果您不在消息循环中发送消息,我认为计时器消息永远不会被触发。如果您在程序中执行了一些较长的过程,并且您从未使用相应的 DispatchMessage 调用 GetMessage/PeakMessage,那么这可能会导致计时器消息永远不会被触发。

于 2012-05-23T14:07:11.210 回答
0

本文介绍了创建和销毁计时器。

我找到了一些仍然使用 hWnd 的示例代码,有什么理由不使用 hWnd 参数吗?如果一个都用不上,可以试试看传入NULL时代码是否有效。我在示例中注意到他们将回调转换为TIMERPROC.

于 2012-05-23T07:50:08.427 回答
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;
}

我不检查错误,你应该。

于 2012-05-24T23:02:56.387 回答