CreateTimerQueueTimer定时器使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013183287/article/details/81976658

开启定时器:

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时,表示调用回调函数时,计时器己经触发。

扫描二维码关注公众号,回复: 5351356 查看本文章

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);

猜你喜欢

转载自blog.csdn.net/u013183287/article/details/81976658