您的位置:首页 > 大数据 > 人工智能

WaitableTimer的实例讲解

2017-08-10 20:11 162 查看
  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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息