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

时间:2014-05-13 14:01:43

标签: c++ visual-c++ visual-studio-2012 timer period

我正在尝试使用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
);

倒数第二个参数说明

  

期间[in]

     

计时器的周期,以毫秒为单位。如果此参数为零,则会向计时器发出一次信号。如果此参数大于零,则计时器是周期性的。每当周期结束时,周期性计时器会自动重新激活,直到计时器被取消。

正如您在我的代码中所看到的,我将截止时间设置为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 NULL\n");
    }
    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;
}

谢谢

2 个答案:

答案 0 :(得分:0)

事件gDoneEvent在函数TimerRoutine()退出之前发出信号。对于重复调用回调函数,在函数gDoneEvent被调用所需次数后发出事件TimerRoutine()的信号。

可以包含以下代码行。

static int count = 0;

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

答案 1 :(得分:0)

@Lokesh是对的,虽然作为一名c ++初学者,我起初并没有得到答案。

只有在希望计时器停止时,才需要确保调用SetEvent(gDoneEvent);。根据我的需要,我只是评论它,因为我希望计时器能够连续运行。