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);
时间: 2024-10-25 00:43:10