博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows多线程同步机制---可等候定时器
阅读量:3987 次
发布时间:2019-05-24

本文共 2176 字,大约阅读时间需要 7 分钟。

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

转载地址:http://qwxui.baihongyu.com/

你可能感兴趣的文章
yuv encode h264 test
查看>>
对一帧YUV进行H264编码
查看>>
h264编码前必须要转换为yuv420p格式
查看>>
generate html code from QTableWidget with row and column span support
查看>>
yuv420
查看>>
QPainter draw yuv data
查看>>
Some collection resource about YUV420
查看>>
yuv420 stream offset calculation
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>
yuv420 format
查看>>
ffmpeg
查看>>
单纯的把Y通道提取出来能正确显示出灰度图来为什么我的Qt就显示不出来呢转换有问题呀?
查看>>
YUV420下各种格式的区别,老外写的
查看>>
YUV420只绘制Y通道
查看>>
yuv420 还原为RGB图像
查看>>
LED恒流驱动芯片
查看>>
驱动TFT要SDRAM做为显示缓存
查看>>
使用file查看可执行文件的平台性,x86 or arm ?
查看>>
qt5 everywhere 编译summary
查看>>
linux驱动分析之DS1302 RTC
查看>>