1 可等候定时器
是一个更加精确系统提供的定时器.能够达到100ns级别. 可以被等候,也可以通过APC回调函数的方式触发
2 定时器的使用
2.1 创建定时器
HANDLE CreateWaitableTimer(LPSECURITY_ATTRIBUTES lpTimerAttributes,
//安全属性
BOOL bManualReset,//重置方式
LPCTSTR lpTimerName //命名
);
返回创建好的定时器的句柄
2.2 设置定时器
BOOL SetWaitableTimer(HANDLE hTimer, //定时器句柄
const LARGE_INTEGER *pDueTime,
//定时器第一次触发的时间,100ns级别(64位整数)
LONG lPeriod,
//后续每次触发的间隔,毫秒级别
PTIMERAPCROUTINE pfnCompletionRoutine,
//APC(异步调用,优先消息队列)处理函数
LPVOID lpArgToCompletionRoutine,
//APC参数
BOOL fResume ); //休眠标识
pDueTime - 正值,表示绝对时间
负值,表示相对于现在的时间间隔
lPeriod - 0 定时器不再有后续触发
大于0 按照间隔触发
pDueTime | lPeriod | lPeriod ....
2.3 等候定时器
WaitForSingleObjectWaitForMultipleObjects
2.4 关闭定时器
CloseHandle2.5 APC定时器(高优先级队列,异步调用,即使程序僵死,依然可以调用该消息队列处理函数来处理消息)
VOID CALLBACK TimerAPCProc(LPVOID lpArgToCompletionRoutine // data value
DWORD dwTimerLowValue // timer low value
DWORD dwTimerHighValue // timer high value
);
2.6 其他
OpenWaitableTimer 打开CancelWaitableTimer 取消
SleepEx();
// WaitableTimer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define _WIN32_WINNT 0x0400
#include "windows.h"
HANDLE g_hTimer = NULL;
DWORD WINAPI TimerThread( LPVOID pParam )
{
while( 1 )
{
WaitForSingleObject( g_hTimer,
INFINITE );
printf( "Hello Timer\n" );
}
return 0;
}
void Create( )
{ //创建定时器
g_hTimer = CreateWaitableTimer(
NULL, FALSE, NULL );
//设置定时器
UINT64 nDueTime = -100000000;
SetWaitableTimer( g_hTimer,
(PLARGE_INTEGER)&nDueTime, 1000,
NULL, NULL, FALSE );
//创建等候线程
DWORD dwThreadID = 0;
HANDLE hThread = CreateThread( NULL, 0,
TimerThread, NULL, 0, &dwThreadID );
WaitForSingleObject( hThread, INFINITE );
//关闭定时器
CloseHandle( g_hTimer );
}
VOID CALLBACK TimerProc(
LPVOID lpArgToCompletionRoutine,
DWORD dwTimerLowValue,
DWORD dwTimerHighValue )
{
printf( "------APC TimerProc--------\n" );
}
void APCTimer( )
{ //创建定时器
HANDLE hTimer = CreateWaitableTimer(
NULL, FALSE, NULL );
//设置定时器
UINT64 nDueTime = -10000000;
SetWaitableTimer( hTimer,
(PLARGE_INTEGER)&nDueTime, 1000,
TimerProc, NULL, FALSE );
//
while( 1 )
{
SleepEx( -1, TRUE );
}
//关闭句柄
CloseHandle( hTimer );
}
int main(int argc, char* argv[])
{
//Create( );//等候定时器
APCTimer( );//回调函数方式触发
return 0;
}