定时器队列(Timer Queue)可以使用CreateTimerQueue函数创建。定时器队列中的定时器是轻量级对象,可以在一定时间间隔之后调用指定的回调函数(可以只调用一次,也可以是周期性的)。这种等待操作由线程池中某个线程处理的(系统级别)。
向定时器队列中添加定时器可以使用CreateTimerQueueTimer函数。更新一个计时器队列中的计时器可以使用 ChangeTimerQueueTimer 函数。这两个函数中你可以指定一个回调函数,如果设定时间到达,线程池中某个线程会调用该回调函数。
使用 DeleteTimerQueueTimer函数可以取消挂起的计时器。当不再使计时器队列的时候,调用 DeleteTimerQueueEx 函数删除计时器队列,该函数调用是会取消并删除任何在该队列中等待的计时器。
1.HANDLE CreateTimerQueue();该函数创建一个定时器队列,定时器队列对一组定时器进行组织安排。一旦拥有一个定时器队列,就可以在该队列中创建下面的定时器:
2.BOOL CreateTimerQueueTimer(PHANDLE phNewTimer, HANDLE hTimerQueue,WAITORTIMERCALLBACK pfnCallback,PVOID pvContext,DWORD dwDueTimer,DWORD dwPeriod,ULONG dwFlags);如果只是创建少数几个定时器,只需要为hTimerQueue参数传递NULL,并且完全避免调用CreateTimerQueue函数。这会使用默认的定时器队列,并且简化你的代码。工作回调函数必须采用下面的原型: VOID WINAPI WaitOrTimerCallback(PVOID pvContext,BOOL fTimerOrWatiFired);
dwFlags参数的取值:WT_EXECUTEDEFAULT(用非I/O组件处理工作项目),WT_EXECUTEINIOTHREAD(用I/O组件),WT_EXECUTEPERSISTENTTHREAD(用定时器),WT_EXECUTELONGFUNCTION(工作项目需要花费较长时间时)
还有一个标志是WT_EXECUTEINTIMERTHREAD,它使定时器组件的线程可以执行工作项目,虽然这可以使工作项目的运行效率更高,但是这非常危险,如果工作项目长时间中断运行,那么等待定时器的线程就无法执行任何其他操作。如果打算这么做,那么该代码应该迅速执行,不应该中断。
回调函数的原型:VOID WINAPI WaitOrTimerCallbackFunc( PVOID pvContext, BOOLEAN fTimerOrWaitFired);
3.可以调用BOOL ChangeTimerQueueTimer(HANDLE hTimerQueue ,HANDLE hTimer, ULONG dwDueTimer,ULONG dwPeriod);函数来改变它的到期时间和到期周期。
4.当不再使用定时器时,必须通过调用下面的函数将它删除:BOOL DeleteTimerQueueTimer(HANDLE hTimerQueue,HANDLE hTimer, HANDLE hCompletionEvent);
5. 当要删除定时器队列:BOOL DeleteTimerQueueEX(HANDLE hTimerQueue,HANDLE hCompletionEvent);
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
using namespace std;
//事件对象
HANDLE g_Event = NULL;
static int COUNT = 0;
VOID CALLBACK TimerRoutine( PVOID lpParameter, BOOLEAN TimerOrWaitFired )
{
if(NULL == lpParameter)
{
OutputDebugString(_T("lpParameter is null。。"));
return;
}
printf("the values of param is :%d\n",*(int*)lpParameter);
COUNT++;
/*if(COUNT >= 3)
{
SetEvent(g_Event);
}*/
}
int main(int argc,TCHAR *argv[])
{
HANDLE hTimer= NULL;
HANDLE hTimerQueue = NULL;
int arg = 123;
g_Event = CreateEvent(NULL,TRUE,FALSE,NULL);
if(NULL == g_Event)
{
OutputDebugString(_T("CreateEvent失败。。"));
return 1;
}
hTimerQueue = CreateTimerQueue();
if(NULL == hTimerQueue)
{
OutputDebugString(_T("CreateTimerQueue失败。。"));
return 1;
}
if(!CreateTimerQueueTimer(&hTimer,hTimerQueue,WAITORTIMERCALLBACK(TimerRoutine),&arg,5000,1000,NULL))
{
OutputDebugString(_T("CreateTimerQueueTimer失败。。"));
return 1;
}
if(WaitForSingleObject(g_Event,INFINITE) !=WAIT_OBJECT_0)
{
OutputDebugString(_T("WaitForSingleObject失败。。"));
}
CloseHandle(g_Event);
if(!DeleteTimerQueue(hTimerQueue))
{
OutputDebugString(_T("DeleteTimerQueue失败。。"));
}
return 0;
}