Chapter09-“内核模式下的线程同步”之可等待的计时器内核对象

可等待的计时器是在某个时间点或一个时间周期内自动触发它们本身的内核对象。与之对应的几个函数:

1)创建可等待计时器函数——CreateWaitableTimer函数
HANDLE WINAPI CreateWaitableTimer(
__in_optLPSECURITY_ATTRIBUTES lpTimerAttributes,
__inBOOL bManualReset,
__in_optLPCTSTR lpTimerName );
第一个参数指定安全属性,
第二个参数如果是TRUE,则表示是手动设置通知的计时器;如果是FALSE,则表示是异步计时器。
第三个参数指定计时器名。


2)打开一个已经创建的可等待计时器函数——OpenWaitableTimer函数
HANDLE WINAPI OpenWaitableTimer(
__inDWORD dwDesiredAccess,
__inBOOL bInheritHandle,
__inLPCTSTR lpTimerName );
第一个参数指定想要的访问权限。
第二个参数指定是否是继承句柄。
第三个参数标记计时器名。


3)由于每个内核对象计数器初始化时都是被设置为非触发状态,所有要想让计时器转为触发状态,需要用到另一个函数——SetWaitableTimer函数
BOOL WINAPI SetWaitableTimer(
__inHANDLE hTimer,
__inconst LARGE_INTEGER *pDueTime,
__inLONG lPeriod,
__in_optPTIMERAPCROUTINE pfnCompletionRoutine,
__in_optLPVOID lpArgToCompletionRoutine,
__inBOOL fResume)
具体参数请查看上面函数名的MSDN链接。


4)取消计时器——CancelWaitableTimer函数
BOOL CancelWaitableTimer(HANDLE hTimer);
其参数就是创建计时器时返回的句柄。

一个示例:

// Declare our local variables.
HANDLE hTimer;
SYSTEMTIME st;
FILETIME ftLocal, ftUTC;
LARGE_INTEGER liUTC;
// Create an auto-reset timer.
hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
// First signaling is at January 1, 2008, at 1:00 P.M. (local time).
st.wYear = 2008; // Year
st.wMonth = 1; // January
st.wDayOfWeek = 0; // Ignored
st.wDay = 1; // The first of the month
st.wHour = 13; // 1PM
st.wMinute = 0; // 0 minutes into the hour
st.wSecond = 0; // 0 seconds into the minute
st.wMilliseconds = 0; // 0 milliseconds into the second
SystemTimeToFileTime(&st, &ftLocal);
// Convert local time to UTC time.
LocalFileTimeToFileTime(&ftLocal, &ftUTC);
// Convert FILETIME to LARGE_INTEGER because of different alignment.
liUTC.LowPart = ftUTC.dwLowDateTime;
liUTC.HighPart = ftUTC.dwHighDateTime;
// Set the timer.
SetWaitableTimer(hTimer, &liUTC, 6 * 60 * 60 * 1000,
NULL, NULL, FALSE); ...


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值