CreateTimerQueueTimer定时器使用

开启定时器:

HANDLE	m_hTimerQueue;
HANDLE	m_hTimerQueueTimer;

void CIDPEventCtrl::StartTimer()
{
 	if (m_hTimerQueue == NULL && m_hTimerQueueTimer == NULL)
 	{
 		m_hTimerQueue = CreateTimerQueue();
 		if (m_hTimerQueue != NULL)
 		{
                        //TimerRoutine为回调函数
                        //40ms循环执行
                        //具体应用可以查看CreateTimerQueueTimer的定义
 			if (!CreateTimerQueueTimer(&m_hTimerQueueTimer, m_hTimerQueue, TimerRoutine, this, 0, 40, WT_EXECUTEDEFAULT))
 			{
 				m_hTimerQueue = NULL;
 				m_hTimerQueueTimer = NULL;
 			}
 		}
 		else
 		{
 			m_hTimerQueue = NULL;
 			m_hTimerQueueTimer = NULL;
 		}
 	}
}

//TimerRoutine回调函数实现
static VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
	//lpParam为传过来的参数
 
}

 CreateTimerQueueTimer参数:

参数

描述

phNewTimer

用来接收创建好的计时器对象句柄的指针

hTimerQueue

计时器线程池对象。为NULL时,使用默认的计时器线程池,此时可以不需调用CreateTimerQueue来创建线程池对象。

pfnCallback

新计时器对象的回调函数。函数原型如下:

Void WINAPI WaitOrTimerCallback(PVOID pvContext,BOOL fTimerOrWaitFired);其中的fTimerOrWaitFired为TRUE时,表示调用回调函数时,计时器己经触发。

pvContext

传给回调函数的额外参数

dwDueTime

预计从调用该函数开始后,多少毫秒后第一次调用回调函数。如果为0,只有可能,就会调用回调函数。

dwPeriod

调用回调函数的周期(毫米数)。如果为0,表示一个单步计时器,即回调函数只被调用一次。

dwFlags

用于指明线程池中的线程在什么条件下调用这个回调函数。该参数的意义与QueueUserWorkItem函数相应的参数相同

备注:如果dwDueTime和dwPeriod均不为0,计时器在dwDueTime后会第1次被触发,以后每经过dwPeriod时间后,周期性地触发。每次触发时都会调用回调函数,哪怕前一个回调函数还没执行完(会启动另一个线程来调用该回调函数)。

 

关闭定时器:

if (m_hTimerQueueTimer != NULL)
    DeleteTimerQueueTimer(m_hTimerQueue, m_hTimerQueueTimer, INVALID_HANDLE_VALUE);
if (m_hTimerQueue != NULL)
    DeleteTimerQueueEx(m_hTimerQueue, INVALID_HANDLE_VALUE);

m_hTimerQueueTimer = NULL;
m_hTimerQueue = NULL;

修改计时器对象周期:ChangeTimeQueueTimer(hTimerQueue,hTimer,dwDueTime,dwPeriod);

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值