event与WaitForSingleObject、MsgWaitForMultipleObjects等
线程一般是死循环,需要一些条件来退出或者执行某些操作,event做这种条件就很合适了。
1、CreateEvent:创建一个命名或者无名的事件对象,函数定义:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPTSTR lpName);
lpEventAttributes:忽略,必须是NULL;
bManualReset:指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当事件被一个等待线程释放以后,系统将会自动将事件状态复原为无信号状态。
bInitialState:指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。
lpName:事件对象的名称,如果是NULL,表示无名事件对象。
2、SetEvent和ResetEvent:将事件设置为发信号与不发信号状态。
BOOL SetEvent(
HANDLE hEvent );
BOOL ResetEvent(
HANDLE hEvent );
hEvent:事件对象句柄。
3、PulseEvent:使一个事件对象的状态发生一次脉冲变化,从无信号变成有信号再变成无信号,而整个操作是原子的。
BOOL PulseEvent(
HANDLE hEvent );
hEvent:事件对象句柄。
4、WaitForSingleObject:等待(阻塞),直到参数所指定的OBJECT成为发信号状态时才返回,OBJECT可以是EVENT,也可以是其它内核对象。
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds );
hHandle:对象句柄,如事件对象的句柄。
dwMilliseconds:指定超时毫秒数,如果是0,函数测试对象状态就立马返回,如果是INFINITE,函数永不超时。
返回值:
WAIT_ABANDONED:指定的对象是一个互斥对象,该对象没有被拥有该对象的线程在线程结束前释放。互斥对象的所有权被同意授予调用该函数的线程。互斥对象被设置成为无信号状态。
WAIT_OBJECT_0:核心对象已被激活。
WAIT_TIMEOUT:等待超时。
WAIT_FAILED:出现错误,可以通过GetLastError得到错误码。
5、MsgWaitForMultipleObjects:当对象中的某个或者系列对象处于信号状态时返回,或者规定时间已过也返回。
DWORD MsgWaitForMultipleObjects(
DWORD nCount,
LPHANDLE pHandles,
BOOL fWaitAll,
DWORD dwMilliseconds,
DWORD dwWakeMask );
nCount:句柄个数。
pHandles:句柄数组。
fWaitAll:是否等待所有的handles被激发才返回。
dwMilliseconds:超时时间。
dwWakeMask:欲观察的用户输入消息类型
6、常规用法:先创建事件对象CreateEvent,然后在线程中WaitForSingleObject或者MsgWaitForMultipleObjects,然后在适当的时候SetEvent。