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