码迷,mamicode.com
首页 > 编程语言 > 详细

第9章 用内核对象进行线程同步(2)_可等待计时器(WaitableTimer)

时间:2015-08-18 18:52:53      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

9.4 可等待的计时器内核对象——某个指定的时间或每隔一段时间触发一次

(1)创建可等待计时器:CreateWaitableTimer(使用时应把常量_WIN32_WINNT定义为0x0400

参数

描述

psa

安全属性(如使用计数、句柄继承等)

bManualReset

手动重置计时器还是自动重置计时器。

①当手动计时器被触发所有正在等待计时器的线程都变可为可调度。

②当自动计时器被触发时只有一个正在等待计数器的线程变为可调度

pszName

对象的名字

(2)也可以打开一个己经存在的可等待计时器:OpenWaitableTimer

(3)设置可等待计时器状态:SetWaitableTimer

参数

描述

HANDLE hTimer

要想触发的计时器

LARGE_INTEGER*  pDueTime

计时器第1次被触发的时间(应该为世界协调时UTC

说明:pDueTime为正数时是个绝对时间为负数时,表示一个相对时间,表示要在相对于调用该函数以后多少个(100ns)毫秒应第1次触发计时器。如5秒后,则应为

-5*10 000 000

LONG lPeriod

第一次触发后,每隔多少时触发一次(单位是微秒)。

如果希望计时器只触发一次,之后不再触后,该参数为0.

PTIMERAPCROUTINE pfnCR

要加入APC队列的回调函数

PVOID pvArgToCR

传给回调函数的额外参数

BOOL bResume

如果为TRUE,而且系统支持电源管理,那么在计时器触发的时候,系统会退出省电模式。如设为TRUE,但系统不支持省电模式,GetLastError就会返回ERROR_NOT_SUPPORTED 适用平台。一般设为FALSE

(4)取消计时器:CancelWaitableTimer,调用后计时器永远不会触发。

【SetWaitableTimer伪代码】——设置计时器在2015年8月18日14:00触发,以后每隔6小时触发一次

HANDLE hTimer;
SYSTEMTIME st = { 0 };
FILETIME ftLocal, ftUTC;
LARGE_INTEGER liUTC;

//创建一个自动的计时器对象
hTimer = CreateWaitableTimer(NULL, FALSE, NULL);

//首先,设置时间为2015年8月18日,14:00(本地时间)
st.wYear = 2015;
st.wMonth = 8;
st.wDay = 18;
st.wHour = 14;  //PM格式的
st.wMinute = 0;
st.wSecond = 0;
st.wMilliseconds = 0;

SystemTimeToFileTime(&st, &ftLocal);

//将本地时间转为UTC时间
LocalFileTimeToFileTime(&ftLocal, &ftUTC);

//将FILETIME转为LARGE_INTEGER(因为对齐方式不同)
//FILETIME结构的地址必须是4的整数倍(32位边界),
//而LARG_INTEGER结构的地址必须是8的整数倍(64位边界)
liUTC.LowPart = ftUTC.dwLowDateTime;
liUTC.HighPart = ftUTC.dwHighDateTime;

//设置计时器
//SetWaitableTimer传入的时间始终是UTC时间(这个时间必须是64位边界)
//在liUTC后,每隔6个小时触发一次
SetWaitableTimer(hTimer, &liUTC, 6 * 60 * 60 * 1000, NULL, NULL, FALSE);

 

第9章 用内核对象进行线程同步(2)_可等待计时器(WaitableTimer)

标签:

原文地址:http://www.cnblogs.com/5iedu/p/4739798.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!