使用CreateTimerQueueTimer创建计时器,Visual Studio 2012, c++,定期运行

Creating a timer with CreateTimerQueueTimer, Visual Studio 2012 ,C++ , running periodically

本文关键字:c++ 运行 2012 Visual CreateTimerQueueTimer 创建 计时器 使用 Studio      更新时间:2023-10-16

我试图使用CreateTimerQueueTimer(...)运行一个功能,每隔一段时间。

我正在使用来自MSDN的一个例子,这一行主要与我有关:

CreateTimerQueueTimer( &hTimer, hTimerQueue,(WAITORTIMERCALLBACK)TimerRoutine, &arg , 50,100, 0)

,语法是:

BOOL WINAPI CreateTimerQueueTimer(
  _Out_     PHANDLE phNewTimer,
  _In_opt_  HANDLE TimerQueue,
  _In_      WAITORTIMERCALLBACK Callback,
  _In_opt_  PVOID Parameter,
  _In_      DWORD DueTime,
  _In_      DWORD Period,
  _In_      ULONG Flags
);

倒数第二个参数表示

时期[在]

定时器的周期,单位为毫秒。如果该参数为零,则发出一次定时器信号。当该参数大于0时,表示该定时器为周期定时器。周期计时器在每次周期结束时自动重新激活,直到计时器被取消。

在我的代码中可以看到,我将Due time设置为50,将周期设置为100。当我运行它时,它没有repeat触发定时器。有人能帮我一下吗?

完整代码如下:

#include "stdafx.h"
#include <string>
#include <iostream>
#include <thread>
#include <Windows.h>
#include <stdio.h>
using namespace std;
HANDLE gDoneEvent;
VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
    if (lpParam == NULL)
    {
        printf("TimerRoutine lpParam is NULLn");
    }
    else
    {
        // lpParam points to the argument; in this case it is an int
        printf("Timer routine called. Parameter is %d.n", 
                *(int*)lpParam);
        if(TimerOrWaitFired)
        {
            printf("The wait timed out.n");
        }
        else
        {
            printf("The wait event was signaled.n");
        }
    }
    SetEvent(gDoneEvent);
}
int main()
{
    HANDLE hTimer = NULL;
    HANDLE hTimerQueue = NULL;
    int arg = 123,x;

    // Use an event object to track the TimerRoutine execution
    gDoneEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    if (NULL == gDoneEvent)
    {
        printf("CreateEvent failed (%d)n", GetLastError());
        return 1;
    }
    // Create the timer queue.
    hTimerQueue = CreateTimerQueue();
    if (NULL == hTimerQueue)
    {
        printf("CreateTimerQueue failed (%d)n", GetLastError());
        return 2;
    }
    // Set a timer to call the timer routine in 10 seconds.
    if (!CreateTimerQueueTimer( &hTimer, hTimerQueue,(WAITORTIMERCALLBACK)TimerRoutine, &arg , 50,100, 0))
    {
        printf("CreateTimerQueueTimer failed (%d)n", GetLastError());
        return 3;
    }
    // TODO: Do other useful work here 
    printf("Call timer routine in 10 seconds...n");
    // Wait for the timer-queue thread to complete using an event 
    // object. The thread will signal the event at that time.
    if (WaitForSingleObject(gDoneEvent, INFINITE) != WAIT_OBJECT_0)
        printf("WaitForSingleObject failed (%d)n", GetLastError());
    CloseHandle(gDoneEvent);
    // Delete all timers in the timer queue.
    if (!DeleteTimerQueue(hTimerQueue))
        printf("DeleteTimerQueue failed (%d)n", GetLastError());
    cin>>x;
    return 0;
}

谢谢

事件gDoneEventTimerRoutine()函数退出前被触发。对于重复调用回调函数,在TimerRoutine()函数被调用一定次数后,通知事件gDoneEvent

可以包括以下代码行:

static int count = 0;
VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
    ......
    count++;
    if(count == 100)
    {
         SetEvent(gDoneEvent);
    }
}

@Lokesh是对的,尽管作为一个c++初学者,我一开始并没有得到他们的答案。

你需要确保SetEvent(gDoneEvent);只在你想计时器停止的时候被调用。对于我的需要,我只是把它注释掉,因为我想让计时器连续运行。