1 基本函数
HANDLE CreateWaitableTimer(
LPSECURITY_ATTRIBUTES lpTimerAttributes,
BOOL bManualReset,
LPCSTR lpTimerName);
lpTimerAttributes,
SECURITY_ATTRIBUTES,指定一个结构,用于设置对象的安全特性,就可使用对象的默认安全设置。
bManualReset
BOOL,如果为TRUE,表示创建一个人工重置计时器;如果为FALSE,则创建一个自动重置计时器。
lpTimerName
LPCSTR,指定可等待计时器对象的名称。如果已经存在拥有这个名字的一个可等待计时器,就直接打开现成的可等待计时器。这个名字不能与一个现有的互斥体、事件、信号机或文件映射的名称相同。
人工重置与自动重置的区别
使用人工重置,则计时结束后所有的等待线程均变为可调度线程;使用自动重置,则只有一个线程变为可调度线程。
BOOL SetWaitableTimer(
HANDLE hTimer,
const LARGE_INTEGER *lpDueTime,
LONG lPeriod,
PTIMERAPCROUTINE pfnCompletionRoutine,
LPVOID lpArgToCompletionRoutine,
BOOL fResume );
hTimer 定时器的句柄。
lpDueTime 设置定时器时间间隔,当设置为正值是绝对时间;当设置为负数是相对时间。
lPeriod 周期。
pfnCompletionRoutine 设置回调函数。
lpArgToCompletionRoutine传送给回调函数的参数。
fResume 设置系统是否自动恢复。
2 控制台程序样例
(巧妙使用了事件对象,实现控制台程序的回调功能)
HANDLE g_hHelpEvent;
void CALLBACK TimerCallback( LPVOID lpArgToCompletionRoutine, DWORD dwTimerLowValue, DWORD dwTimerHighValue )
{//这里处理定时器触发
SetEvent(g_hHelpEvent);
SYSTEMTIME st;
GetLocalTime(&st);
printf("%02d:%02d\n",st.wMinute,st.wSecond);
}
int _tmain(int argc, _TCHAR* argv[])
{
//创建事件内核对象,默认未触发状态
HANDLE hTimer = CreateWaitableTimer(NULL, TRUE, NULL);
//创建事件,设置为未触发状态
g_hHelpEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
SYSTEMTIME st;
GetLocalTime(&st);
//st.wSecond += 40;
FILETIME ft;
SystemTimeToFileTime(&st, &ft);
//转换成UTC时间
FILETIME ftUtc;
LocalFileTimeToFileTime(&ft, &ftUtc);
LARGE_INTEGER fTime={0};//-2*10000000
//fTime.LowPart = ftUtc.dwLowDateTime;
//fTime.HighPart = ftUtc.dwHighDateTime;
//当前时间的后一分钟触发,以后每10秒钟触发一次
BOOL bRet = SetWaitableTimer(hTimer, &fTime, 2*1000, TimerCallback, (LPVOID)hTimer, FALSE);
DWORD dwError = GetLastError();
//将TimerCallback回调加入到系统APC队列后,只能通过SleepEx、WaitForSingleObjectEx、WaitForMultipObjectEx、
//或者SignalObjectAndWait 进入等待状态APC回调函数才能被同一线程调用。
DWORD dwRet=WaitForSingleObject(g_hHelpEvent, 1000);
while( WAIT_TIMEOUT == dwRet)
SleepEx(1000*60, TRUE);
switch( dwRet )
{
case WAIT_OBJECT_0://
printf("定时器对象已经触发\n");
break;
case WAIT_TIMEOUT:
printf("等待超时,自动终止定时器对象\n");
CancelWaitableTimer(hTimer);
break;
case WAIT_FAILED:
printf("WaitForSingleObject调用失败,系统错误码\n");
break;
}
CloseHandle(hTimer);
CloseHandle(g_hHelpEvent);
getchar();
return 0;
}
本文详细介绍了Windows系统中CreateWaitableTimer与SetWaitableTimer函数的使用方法,并提供了一个利用事件对象实现回调功能的控制台程序示例。
2070

被折叠的 条评论
为什么被折叠?



