Event 对象之所以有大用途,正是因为它们的状态完全在你掌控之下。Mutexes 和 sem aphores 就 不 一 样 了 , 它 们 的 状 态 会 因 为 诸 如WaitForSingleObject() 之类的函数调用而变化。所以, 你可以精确告诉一个event 对象做什么事,以及什么时候去做。
Event 对象是一种核心对象,它的唯一目的就是成为激发状态或未激发状态。
HANDLE
CreateEvent(
LPSECURITY_ATTRIBUTES
lpEventAttributes,
BOOL
bManualReset,
BOOL
bInitialState,
LPCTSTR
lpName
);
参数
lpEventAttributes
安全属性。
NULL
表示使用默认属性。
bManualReset
如果是
TRUE
,表示不会自动重置,必须靠程序操作(调用
ResetEvent()
)才能将激发状态的
event
重置为非激发状态。如为
FALSE
,表示这个
event
将在变成激发状态(因而唤醒一个线程)之后,自动重置(
reset)为非激发状态。
(true表示该event为手动重置;false表示为自动重置。重置就是reset,表示将event设置为未激活状态。)
bInitialState 如为 TRUE ,表示这个 event 一开始处于激发状态。如为 FALSE ,则表示这个 event 一开始处于非激发状态。
lpName Event 对象的名称。任何线程或进程都可以根据这个文字名称,使用这一 event 对象。
1.SetEvent() 把 event 对象设为激发状态
2.ResetEvent()
把
event
对象设为非激发状态(译注:在此我要提醒读者,"Reset"
的意思是“设定为非激发状态”,而非“重新设定为
激发状态”。)
3.PulseEvent()
(pulse,跳动,调整)
如果是一个
Manual Reset Event
:把
event
对象设为激发状态,唤醒“所有”等待中的线程,然后
event
恢复为非激发
状态。
如果是一个 Auto Reset Event:把 event 对象设为激发状态,唤醒“一个”等待中的线程,然后 event 恢复为非激发状态。
总结:pulseEvent()的作用,类似于SetEvent()和reset()函数。都是将一个event设置为激活状态,但是紧接着,该event会变为非激活状态。这就是“pulse”跳动的由来。
pulseEvent()唤醒一个等待中的线程后,event的状态变为非激活状态。这是因为被该event唤醒的线程拥有了该event的使用权。