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);
取消等待定时器
创建定时器
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; }
相关文章推荐
- Windows核心编程学习九:利用内核对象进行线程同步
- Windows 核心编程之6 线程内核对象
- Windows编程--线程和内核对象的同步-事件内核对象
- Windows编程--线程和内核对象的同步-等待定时器内核对象
- windows核心编程---用内核对象进行线程同步
- windows核心编程心解--内核对象
- 读Windows核心编程-3-内核对象
- Windows核心编程学习八:事件内核对象
- Windows编程那些事----线程与内核对象同步之【信标对象】
- 【Windows 核心编程】Windows 核心编程 -- 内核对象
- Windows编程--线程和内核对象的同步-信标(信号量)内核对象
- Windows高级编程之线程与内核对象的同步
- Windows核心编程--用内核对象进行线程同步(一)
- Windows核心编程_3.内核对象
- Windows-核心编程-09-如何用内核对象进行线程同步-事件内核对象
- windows核心编程-事件内核对象
- windows核心编程--内核对象
- Windows-核心编程-09-如何用内核对象进行线程同步-信号内核对象
- Windows编程-- 线程和内核对象的同步 - 互斥对象内核对象
- WINDOWS核心编程学习1------内核对象