关于 CreateEvent 和WaitForMultipleObjects以及 WaitForSingleObject 等函数的使用实例

时间:2022-01-27 20:37:12

1   创建时间句柄:CreateEvent 

HANDLE  H_Event[2];

 HANDLE  HSignal;

 H_Event[0] = ::CreateEvent(NULL,TRUE,FALSE,NULL);  

H_Event[1] = ::CreateEvent(NULL,FALSE,FALSE,NULL);

HSignal =  ::CreateEvent(NULL,FALSE,FALSE,NULL);

 关于第二个和第三个参数的说明

  第二个参数指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当事件被一个等待线程释放以后,系统将会自动将事件状态复原为无信号状态。
第三个参数 指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。

2  WaitForSingleObject 

 函数第一个参数:事件句柄,

函数第二个参数:  超时时间,超时后向后执行,

如果为WSA_INFINITE 永不超时

如果为INFINITE,则为立即向后执行

  只检测一个事件,如果事件有信号的话就执行, 返回的参数: WAIT_OBJECT_0 (有信号),超时:WAIT_TIMEOUT

    

3   WaitForMultipleObjects 

   //第三个参数为FALSE,表示,只要有信号就可以接着执行,

//第三个参数为TRUE,表示,只有所有事件都有信号的时候才能执行下去,


下面是代码实例:

// Waitforproject.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
//#include<windef.h> //HANDLE 必须使用的头文件
#include<Windows.h> //使用事件和线程必须要有的头文件。
#include<iostream>
using namespace std;
HANDLE  H_Event[2];

HANDLE  HSignal;






DWORD WINAPI pThreadFunc(LPVOID lprama)
{
	while(1)
	{
		int nIndex = ::WaitForMultipleObjects(2, H_Event,TRUE,500); //第三个参数为TRUE,表示,只有所有事件都有信号的时候才能执行下去,

		if(nIndex == WAIT_TIMEOUT)
		{
			cout<<"Time Out"<<endl;
		}
		else if(nIndex >= WAIT_OBJECT_0 && nIndex <=WAIT_OBJECT_0+1) //就是所有事件都有信号的时候,才会执行
		{
			cout<<"ALL Event is ok " <<endl;
			break;
		}


#if 0
		int nIndex = ::WaitForMultipleObjects(2, H_Event,FALSE,500); //第三个参数为FALSE,表示,只要有信号就可以接着执行,	
		
		if(nIndex == WAIT_OBJECT_0) //第一个事件
		{
			cout<<"ONE"<<endl; //将事件的信号设置为手动退出,这样子可以做线程挂起
		}
		else if(nIndex == WAIT_OBJECT_0 +1) //第二个事件
		{
				
			cout<< "Break the Threa" <<endl;  //将事件信号设置为自动退出 ,可以做启动线程和退出线程
			break;
		}	
		else if(nIndex == WAIT_TIMEOUT) // 
		{
			cout<<"Time OUT"<<endl; 
		}

#endif	
	}



	cout<<"EXit the  Thread" <<endl;
	return 1;
	
}

DWORD WINAPI PThreadFuncSignal(LPVOID LPrama)
{
	while (1)
	{
		int nIndex = ::WaitForSingleObject(HSignal,500);
		if(nIndex == WAIT_OBJECT_0)
		{
			cout<<"break siagnel "<<endl;
			break;
		}
		cout<<"Signal"<<endl;
	}
	return 1;
}


int _tmain(int argc, _TCHAR* argv[])
{
	H_Event[0] = ::CreateEvent(NULL,TRUE,FALSE,NULL);  
	H_Event[1] = ::CreateEvent(NULL,FALSE,FALSE,NULL);
	CreateThread(NULL,0,pThreadFunc,NULL,0,NULL);  

	SetEvent(H_Event[0]);
	Sleep(3000);
	SetEvent(H_Event[1]);

#if 0
	HSignal =  ::CreateEvent(NULL,FALSE,FALSE,NULL);
	CreateThread(NULL,0,PThreadFuncSignal,NULL,0,NULL);  

	Sleep(3000);
	SetEvent(HSignal);
#endif
#if 0
	/* CreatEvent 函数。
	第二个参数指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当事件被一个等待线程释放以后,系统将会自动将事件状态复原为无信号状态。
	第三个参数 指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。
	*/
	H_Event[0] = ::CreateEvent(NULL,TRUE,FALSE,NULL);  
	H_Event[1] = ::CreateEvent(NULL,FALSE,FALSE,NULL);


	CreateThread(NULL,0,pThreadFunc,NULL,0,NULL);  
	

	for(int i = 0; i<10;i++)
	{
		cout<<i<<endl;
		Sleep(1000);	
		if(i == 2 )
		{
			SetEvent(H_Event[0]);
		}
		else if(i == 5)
		{
			ResetEvent(H_Event[0]);

		}

	}

	SetEvent(H_Event[1]);
#endif
	system("pause:");
	return 0;
}