无窗口定时器SetWaitableTimer


#include "stdafx.h"
#include<iostream>
#include<windows.h>
#include<ctime>
using namespace std;

VOID APIENTRY TimerAPCRoutine( PVOID pvArgToCompletionRoutine,DWORD dwTimerLowValue,DWORD dwTimerHighValue)
 
{
       static DWORD tl=dwTimerLowValue;

	   cout<<"high:"<<dwTimerHighValue<<" low: "<<dwTimerLowValue-tl<<endl;

	   tl=dwTimerLowValue;
 
}
 
void main()
 
{
 
      HANDLE hTimer = CreateWaitableTimer( NULL,FALSE,NULL );
 
      LARGE_INTEGER li;
 
      li.QuadPart = 0;
 
       
	  if( !SetWaitableTimer( hTimer,&li,2*1000,TimerAPCRoutine,NULL,FALSE ))
 
		{
 
			CloseHandle( hTimer );
 
			return;
 
		}
 
 
		while ( 1 )
 
		{            

			//SleepEx( 10000,TRUE );
           
            //只按照APC定时节奏启动
            
            SleepEx( -1,TRUE );		
 
		}
 
		CloseHandle( hTimer );
 
		getchar();
 
}

函数原型:DWORD WINAPI SleepEx(DWORD dwMilliseconds,BOOL bAlertable);

说明:
SleepEx函数中止当前线程运行直到指定的条件被触发。当以下任意一点出现时,当前线程将恢复运行。
● I/O回调函数被调用
● Asynchronous Procedure Call(APC)异步函数被插入线程
● 当前线程休眠时间超过最小超时值
参数说明:
dwMilliseconds
单位毫秒,线程休眠的时间。
如果该值设为0,当前线程将放弃它剩余的执行时间片,被将时间片平均分给与它同等级的其它线程。如果当前进程没有与它同等级的线程运行,该函数SleepEx立即返回,线程继续执行。
如果INFINITE值被指定,当前线程的休眠不会超时。
bAlertable
如果该参数为FALSE,函数不会返回直到超时已到。如果一个I/O回调函数出现,该函数也不会返回而且回调函数也不会执行。如果一个APC函数插入线程,该函数不会返回而且APC函数也不会执行。
如果该参数为TRUE而且SleepEx与扩展I/O函数(ReadFileEx or WriteFileEx)是在同一个线程,函数就会立即返回当线程休眠超时或I/O回调函数出现。如果I/O回调函数出现,那么I/O回调函数会被调用。如果APC被插入线程,该函数不论当前线程是否超时都会立即执行,而且APC函数也会被调用。
返回值:
当线程休眠超时函数返回0。
如果函数返是由于I/O回调函数导致,那么返回值是WAIT_IO_COMPLETION,这只会出现在当bAlertable设置TRUE时的情况。 
 
Sleep和 SleepEx函数的功能是在指定的执行时间内中止所在线程的执行。SleepEx扩展了Sleep的功能,在最短超时时间间隔已到的情况下恢复线程执行外,在以下两种情况下发生时也可以恢复执行:I/O完成回调函数被调用、异步过程调用(APC)被安排进入线程中。
函数原型:
VOID WINAPI Sleep(
    DWORD dwMillseconds);
DWORD WINAPI SleepEx(
    DWORD dwMillesconds,
    BOOL bAlertable);
参数:
dwMilliseconds: 输入参数,Sleep与SleepEx函数的dwMilliseconds参数都是指定线程挂起最短时间间隔,以ms为单位。
bAlertable: 输入参数,SleepEx如果被设置为FALSE,那么,在线程挂起期间不会响应。如果一个I/O完成回调函数被调用或有新的APC按排进入,他们使函数返回,也不会被执行。
返回值:
Sleep函数无返回值,SleepEx返回0表示时间间隔完成,返回WAIT_IO_COMPLETION表示I/O完成回调函数被调用。

猜你喜欢

转载自blog.csdn.net/sichuanpb/article/details/84799780