版权声明:本文为博主原创文章,未经博主允许不得转载。 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);