使用CreateTimerQueueTimer函数创建定时器,Visual Studio 2012,C++,定期运行

3

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

倒数第二个参数表示:

Period [in]

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

从我的代码中可以看出,我将Due时间设置为50,周期设置为100。当我运行它时,它不会重复触发计时器。有人可以帮我吗?

这是整个代码:

#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;
}

谢谢


http://www.sscce.org/ - Hans Passant
你的代码对我来说是有效的。你期望的输出是什么? - Sunius
在10秒钟后调用计时器例程... 计时器例程已调用。参数为123。 等待超时了,然后它会等待我的键盘命令。 - user3463936
2个回答

1
事件 gDoneEvent 在函数 TimerRoutine() 退出之前被触发。对于重复调用回调函数,需要在函数 TimerRoutine() 被调用所需的次数之后,触发事件 gDoneEvent
可以包含以下代码行。
static int count = 0;

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

0

@Lokesh是正确的,虽然作为一个C++初学者,我一开始没有理解他们的答案。

你需要确保只有在想要计时器停止时才调用SetEvent(gDoneEvent);。对于我的需求,我只是将其注释掉,因为我希望计时器持续运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接