您的位置:首页 > 编程语言

windows核心编程-可等待的计时器内核对象

2016-12-07 14:57 267 查看
要创建可等待的计时器,我们需要调用CreateWaitableTimer函数

HANDLE WINAPI CreateWaitableTimer(
_In_opt_ LPSECURITY_ATTRIBUTES lpTimerAttributes,
_In_     BOOL                  bManualReset,   //TRUE手动,FALSE自动
_In_opt_ LPCTSTR               lpTimerName
);


bManualReset表示要创建的是一个手动重置计时器还是自动重置计时器。当手动计时重置计时器被触发的时候,

正在等待该计时器的所有线程编程可调度状态;自动计时器被触发的时候,只有一个正在等待该计时器的线程回

变成可调度状态。

在创建的时候,可等待的计时器对象总是处于未触发状态。当我们想要触发计时器的时候,必须要调用SetWaitableTimer

函数来告诉他:

BOOL WINAPI SetWaitableTimer(
_In_           HANDLE           hTimer,   //想要触发的计时器
_In_     const LARGE_INTEGER    *pDueTime,    //第一次触发的时间,注意是大整数类型的
_In_           LONG             lPeriod,    //触发的频度
_In_opt_       PTIMERAPCROUTINE pfnCompletionRoutine,  //当不用异步的时候为NULL,否则传入APC函数

_In_opt_       LPVOID           lpArgToCompletionRoutine,
_In_           BOOL             fResume
);


因为pDueTime是LARGE_INTEGER类型的参数所以当声明为SYSTEMTIME st;的时候,应该

SystenTimeToFileTime(&st,&ftLocal);// 先转换为FILETIME

LocalFileTimeToFileTime(&ftLocal,&ftUTC);//然后再转换为FILETIMETIME  UTC

lPeriod表示触发的频度,单位是微秒,1s=1000ms=1000 000vs

当pDueTime传入的是负值的时候,表示相对时间,即SetWaitableTime调用结束后的相对时间

当lPeriod传入的是0的时候,表示计时器只触发一次。然后我们就可以CloseHandle来关闭计时器了

或者再次调用SetWaitableTimer来重置计时器。

BOOL CancelWaitableTimer(HANDLE hTimer) //表示取消句柄所标识的计时器


pfnCompletionRoutine:当赋值的时候,时间一到,就把一个APC添加到队列当中,但是这个线程必须是

等待状态的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: