事件Event实际上是个内核对象,下面列出一些常用的函数。
第一个 CreateEvent
函数功能:创建事件
HANDLE
WINAPI
CreateEventW(
__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,//表示安全控制,一般直接传入NULL。
__in BOOL bManualReset,//手动置位还是自动置位,TRUE手动置位,FALSE自动置位。如果为自动置位,则对该事件调用WaitForSingleObject()后会自动调用ResetEvent()使事件变成未触发状态。
__in BOOL bInitialState,//事件的初始状态,传入TRUR表示已触发。
__in_opt LPCWSTR lpName//事件的名称,传入NULL表示匿名事件。
);
第二个 OpenEvent
函数功能:根据名称获得一个事件句柄。
HANDLE
WINAPI
OpenEventW(
__in DWORD dwDesiredAccess,//表示访问权限,对事件一般传入EVENT_ALL_ACCESS。详细解释可以查看MSDN文档。
__in BOOL bInheritHandle,//表示事件句柄继承性,一般传入TRUE即可。
__in LPCWSTR lpName//参数表示名称,不同进程中的各线程可以通过名称来确保它们访问同一个事件。
);
第三个 SetEvent
函数功能:触发事件
BOOL
WINAPI
SetEvent(
__in HANDLE hEvent
);
函数说明:每次触发后,必有一个或多个处于等待状态下的线程变成可调度状态。
第四个 ResetEvent
函数功能:将事件设为末触发
BOOL
WINAPI
ResetEvent(
__in HANDLE hEvent
);
第五个 PulseEvent
函数功能:将事件触发后立即将事件设置为未触发,相当于触发一个事件脉冲。
BOOL
WINAPI
PulseEvent(
__in HANDLE hEvent
);
函数说明:这是一个不常用的事件函数,此函数相当于SetEvent()后立即调用ResetEvent();此时情况可以分为两种:
1.对于手动置位事件,所有正处于等待状态下线程都变成可调度状态。
2.对于自动置位事件,所有正处于等待状态下线程只有一个变成可调度状态。
此后事件是末触发的。该函数不稳定,因为无法预知在调用PulseEvent ()时哪些线程正处于等待状态。
最后一个事件是清理与销毁
由于事件是内核对象,因此使用CloseHandle()就可以完成清理与销毁了。
有关事件Event的总结:
1.事件是内核对象,事件分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。
2.事件可以由SetEvent()来触发,由ResetEvent()来设成未触发。还可以由PulseEvent()来发出一个事件脉冲。
3.事件可以解决线程间同步问题,因此也能解决互斥问题。