可等候定时器

  1 可等候定时器
    是一个更加精确系统提供的定时器.能够达到100ns级别. 
    
  2 定时器的使用
    2.1 创建定时器

        HANDLE CreateWaitableTimer(
      LPSECURITY_ATTRIBUTES lpTimerAttributes,//安全属性
      BOOL bManualReset,//重置方式
      LPCTSTR lpTimerName //命名
      );

      返回创建好的定时器的句柄
    2.2 设置定时器

复制代码
      BOOL SetWaitableTimer(
       HANDLE hTimer, //定时器句柄
       const LARGE_INTEGER *pDueTime,//定时器第一次触发的时间,100ns级别
       LONG lPeriod, //后续每次触发的间隔,毫秒级别
       PTIMERAPCROUTINE pfnCompletionRoutine,  //APC处理函数
       LPVOID lpArgToCompletionRoutine,//APC参数
       BOOL fResume ); //休眠标识
复制代码

       pDueTime - 正值,表示绝对时间
          负值,表示相对于现在的时间间隔
       lPeriod  - 0  定时器不再有后续触发
          大于0 按照间隔触发
             
       pDueTime | lPeriod | lPeriod ....
         
    2.3 等候定时器
      WaitForSingleObject
      WaitForMultipleObjects
    2.4 关闭定时器
      CloseHandle
    2.5 APC定时器 (异步调用处理)

      VOID CALLBACK TimerAPCProc(
      LPVOID lpArgToCompletionRoutine   // data value
      DWORD dwTimerLowValue // timer low value
      DWORD dwTimerHighValue   // timer high value
          );

  2.6 其他
    OpenWaitableTimer 打开
    CancelWaitableTimer 取消

 

// 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, //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 );                 //阻塞main()函数,但是waitabletimer的消息还是能执行。说明这是另外一个消息队列
}

//关闭句柄
CloseHandle( hTimer );
}


int main(int argc, char* argv[])
{
Create( );
//APCTimer( );

return 0;
}

posted on 2014-10-10 15:17  归海一刀  阅读(423)  评论(0)    收藏  举报