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

来源:互联网 发布:加密软件怎么破解 编辑:程序博客网 时间:2024/06/06 00:31

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 0int 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 0HSignal =  ::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]);#endifsystem("pause:");return 0;}




2 0
原创粉丝点击