windows多线程同步机制---可等候定时器

时间:2021-10-09 00:11:23

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 等候定时器

      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 取消

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;
}