CreateTimerQueueTimer学习笔记

        定时器队列(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;
}

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值