Создание таймера с помощью CreateTimerQueueTimer, Visual Studio 2012, C ++, работающей периодически

Я пытаюсь использовать 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
);

Второй до последнего аргумент государства

Период [в]

Период таймера в миллисекундах. Если этот параметр равен нулю, таймер сигнализируется один раз. Если этот параметр больше нуля, таймер является периодическим. Периодический таймер автоматически активируется каждый раз, когда истекает период, пока таймер не будет отменен.

Как вы можете видеть в моем коде, я установил срок выполнения 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

Решение

Событие gDoneEvent сигнализируется перед функцией TimerRoutine() выходы. Для повторных вызовов функции обратного вызова, сигнализировать о событии gDoneEvent после функции TimerRoutine() вызывается необходимое количество раз.

Может включать в себя следующие строки кодов.

static int count = 0;

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

Другие решения

@Lokesh прав, хотя я, как новичок в c ++, сначала не получил их ответа.

Вы должны убедиться, SetEvent(gDoneEvent); вызывается только тогда, когда вы хотите, чтобы таймер остановился. Для своих нужд я просто прокомментировал это, поскольку хотел, чтобы таймер работал непрерывно.

0

По вопросам рекламы [email protected]