您的位置:首页 > 编程语言

Windows 核心编程内核对象同步之-Waitable timer

2008-11-22 00:08 661 查看
基本函数介绍:

创建定时器

HANDLEWINAPICreateWaitableTimer(

__in_optLPSECURITY_ATTRIBUTESpsa,

__inBOOLbManualReset,

__in_optLPCTSTRlpTimerName

);

参数1:此参数在Vista下,如果跨Session通信的话注意权限和完整性问题
参数2:创建的是手动重置的等待定时器还是自动重置的等待定时器
参数3:内核对象的名称,类似如Gloable/AA或者AA的形式

刚创建的时候,等待定时器的状态总是没有触发的状态,需要调用SetWaitableTimer函数触发

获得一个已经创建的等待定时器的句柄根据名称来访问

HANDLEWINAPIOpenWaitableTimer(

__inDWORDdwDesiredAccess,

__inBOOLbInheritHandle,

__inLPCTSTRlpTimerName

);

设置定时器

BOOLWINAPISetWaitableTimer(

__inHANDLEhTimer,

__inconstLARGE_INTEGER*pDueTime,

__inLONGlPeriod,

__in_optPTIMERAPCROUTINEpfnCompletionRoutine,

__in_optLPVOIDlpArgToCompletionRoutine,

__inBOOLfResume

);

参数1:需要触犯的等待定时器的句柄
参数2:
参数3:2,3参数一起使用,DueTime表示的是第一次触发的时间,而period表示的是第一次触发之后,定时器调度的频度(即多久之后再次触发)
参数4:定时器被触发的时候的APC函数地址,此APC例程只有当Set函数的调用线程正处于alterablestate的时候,此函数才会被set函数的同一个线程所调用
参数5:传送给参数4的函数的参数

Note:参数2的类型是LARGE_INTEGER不能直接的接受SYSTEMTIME结构类型,尽管他们的结构一致,但是LARGE_INTEGER是64位对齐,而SYSTEMTIME是32位对齐
可以做如下的转换:
FILETIMEftFileTime;
LARGE_INTEGERliTime;
liTime.LowPart=ftFileTime.dwLowDateTime;
liTime.QuardPart=ftFileTime.dwHighDateTime;
另外次函数传入的时间默认的是UTC时间
第一次触发的时间可以是个绝对时间也可以是个相对时间,只需pDueTime传入负值
例如如下代码:

HANDLEhTimer=INVALID_HANDLE_VALUE;

LARGE_INTEGERliDueTime={0};

hTimer=CreateWaitableTimer(NULL,FALSE,NULL);

if(hTimer==INVALID_HANDLE_VALUE)

{

return-1;

}

constintiTimerUnitPerSecond=1000000;

liDueTime.LowPart=-(5*iTimerUnitPerSecond);

SetWaitableTimer(hTimer,liDueTime,lPeriod,NULL,NULL,FALSE);

取消等待定时器

BOOLWINAPICancelWaitableTimer(
__inHANDLEhTimer
);
Note:关于Timer的APC例程,函数必须保证APCRoute函数必须在下次Timer被再次触发之前结束,
否则APC函数加入队列的速度超过了处理他们的速度,APC例程将会一直被执行
VOIDAPIENTRYTimerFunction(PVOIDpvArg,DWORDdwLowPart,DWORDdwHighPart)
{
FILETIMEftUTC,ftLocal;
SYSTEMTIMEst;
TCHARtszBuf[MAX_PATH]={0x00};

ftUTC.dwLowDateTime=dwLowPart;
ftUTC.dwHighDateTime=dwHighPart;

FileTimeToLocalFileTime(&ftUTC,&ftLocal);

FileTimeToSystemTime(&ftLocal,&st);
GetDateFormat(LOCALE_USER_DEFAULT,0,&st,NULL,
_tcschr(tszBuf,TEXT('/0')),
(int)(_countof(tszBuf)-_tcslen(tszBuf)));

_tprintf(TEXT("TimerWentOK.../n"));
Sleep(2000);
}

VOIDTimerTest()
{
HANDLEhTimer=INVALID_HANDLE_VALUE;

hTimer=CreateWaitableTimer(NULL,FALSE,NULL);
if(hTimer==INVALID_HANDLE_VALUE)
{
return;
}

LARGE_INTEGERliTime={0};
SetWaitableTimer(hTimer,&liTime,5000,
TimerFunction,NULL,FALSE);

SleepEx(INFINITE,TRUE);
CloseHandle(hTimer);

}

int_tmain(intargc,_TCHAR*argv[])
{
TimerTest();
return0;
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: