Windows 核心编程内核对象同步之-Waitable timer
来源:互联网 发布:凡客建站seo 编辑:程序博客网 时间:2024/05/17 06:13
基本函数介绍:
创建定时器
- HANDLE WINAPI CreateWaitableTimer(
- __in_opt LPSECURITY_ATTRIBUTES psa,
- __in BOOL bManualReset,
- __in_opt LPCTSTR lpTimerName
- );
参数1:此参数在Vista下,如果跨Session通信的话注意权限和完整性问题
参数2:创建的是手动重置的等待定时器还是自动重置的等待定时器
参数3:内核对象的名称,类似如Gloable/AA 或者AA的形式
刚创建的时候,等待定时器的状态总是没有触发的状态,需要调用 SetWaitableTimer函数触发
获得一个已经创建的等待定时器的句柄根据名称来访问
- HANDLE WINAPI OpenWaitableTimer(
- __in DWORD dwDesiredAccess,
- __in BOOL bInheritHandle,
- __in LPCTSTR lpTimerName
- );
设置定时器
- BOOL WINAPI SetWaitableTimer(
- __in HANDLE hTimer,
- __in const LARGE_INTEGER *pDueTime,
- __in LONG lPeriod,
- __in_opt PTIMERAPCROUTINE pfnCompletionRoutine,
- __in_opt LPVOID lpArgToCompletionRoutine,
- __in BOOL fResume
- );
参数
1:需要触犯的等待定时器的句柄参数2:
参数3:2,3参数一起使用,DueTime 表示的是第一次触发的时间,而period表示的是第一次触发之后,定时器调度的频度(即多久之后再次触发)
参数4:定时器被触发的时候的APC函数地址,此APC例程只有当Set函数的调用线程正处于 alterable state的时候,此函数才会被set函数的同一个线程所调用
参数5:传送给参数4的函数的参数
Note:参数2的类型是 LARGE_INTEGER 不能直接的接受SYSTEMTIME结构类型,尽管他们的结构一致,但是LARGE_INTEGER是64位对齐,而SYSTEMTIME是32位对齐
可以做如下的转换:
FILETIME ftFileTime;
LARGE_INTEGER liTime;
liTime.LowPart = ftFileTime.dwLowDateTime;
liTime.QuardPart = ftFileTime.dwHighDateTime;
另外次函数传入的时间默认的是UTC时间
第一次触发的时间可以是个绝对时间也可以是个相对时间,只需pDueTime传入负值
例如如下代码:
- HANDLE hTimer =INVALID_HANDLE_VALUE;
- LARGE_INTEGER liDueTime = {0};
- hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
- if(hTimer == INVALID_HANDLE_VALUE)
- {
- return -1;
- }
- const int iTimerUnitPerSecond = 1000000;
- liDueTime.LowPart = -(5*iTimerUnitPerSecond);
- SetWaitableTimer(hTimer, liDueTime, lPeriod, NULL, NULL, FALSE);
取消等待定时器
- BOOL WINAPI CancelWaitableTimer(
- __in HANDLE hTimer
- );
Note:关于Timer的APC例程,函数必须保证 APC Route函数必须在下次Timer被再次触发之前结束,
否则APC函数加入队列的速度超过了处理他们的速度,APC例程将会一直被执行
- VOID APIENTRY TimerFunction(PVOID pvArg, DWORD dwLowPart, DWORD dwHighPart)
- {
- FILETIME ftUTC, ftLocal;
- SYSTEMTIME st;
- TCHAR tszBuf[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("Timer Went OK.../n"));
- Sleep(2000);
- }
- VOID TimerTest()
- {
- HANDLE hTimer = INVALID_HANDLE_VALUE;
- hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
- if(hTimer == INVALID_HANDLE_VALUE)
- {
- return ;
- }
- LARGE_INTEGER liTime = {0};
- SetWaitableTimer(hTimer, &liTime, 5000,
- TimerFunction, NULL, FALSE);
- SleepEx(INFINITE, TRUE);
- CloseHandle(hTimer);
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- TimerTest();
- return 0;
- }
- Windows 核心编程内核对象同步之-Waitable timer
- 《Windows核心编程》之“内核对象同步”
- windows 核心编程之9 内核对象用于线程同步
- windows核心编程之线程内核对象同步(1)
- windows核心编程之线程内核对象同步(2)
- Windows核心编程之3 内核对象
- 《Windows核心编程》之“内核对象”
- Windows核心编程:用内核对象进行线程同步
- Windows核心编程 用内核对象进行线程同步
- windows核心编程-9.用内核对象进行线程同步
- windows核心编程-用内核对象进行线程同步
- windows核心编程---用内核对象进行线程同步
- 线程与内核对象的同步——Windows核心编程学习手札之九
- 摘自windows核心编程之用内核对象进行线程同步
- (摘自windows核心编程之用内核对象进行线程同步)
- (摘自windows核心编程之用内核对象进行线程同步)
- windows核心编程--内核对象
- windows核心编程--内核对象
- 自定义类型实现系统接口(一)
- 整理一下,定时器用法
- MySQL Replication(复制)基本原理
- 判断对话框是否被激活 判断程序主界是否在前台
- [转] Web架构设计经验分享
- Windows 核心编程内核对象同步之-Waitable timer
- MySQL单表到底可以多大
- 自己搞了函数行专列还是可以拼接
- Asp.Net 学习资源列表
- JBPM源码分析(二)-----JbpmContext
- Perl精简版netstat
- Linux服务器的架设 (DHCP,NIS,SAMBA,FTP,DNS)
- Squid3.0反向代理的安装与配置
- Web缓存