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