Я пытаюсь использовать 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;
}
Спасибо
Событие gDoneEvent
сигнализируется перед функцией TimerRoutine()
выходы. Для повторных вызовов функции обратного вызова, сигнализировать о событии gDoneEvent
после функции TimerRoutine()
вызывается необходимое количество раз.
Может включать в себя следующие строки кодов.
static int count = 0;
VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
......
count++;
if(count == 100)
{
SetEvent(gDoneEvent);
}
}
@Lokesh прав, хотя я, как новичок в c ++, сначала не получил их ответа.
Вы должны убедиться, SetEvent(gDoneEvent);
вызывается только тогда, когда вы хотите, чтобы таймер остановился. Для своих нужд я просто прокомментировал это, поскольку хотел, чтобы таймер работал непрерывно.