一、综述:
SetEvent () )将当前事件对象置于有信号的状态,以便当前线程可以继续运行。
ResetEvent ) )在当前事件对象处于无信号状态且当前线程处于休眠状态时无法执行。
如果设置为TRUE,则为有信号的状态CreateEvent (,TRUE,)=CreateEvent (,FALSE,) (SetEvent ) )
CreateEvent (,TRUE ) :将事件对象的开始状态设置为有信号;
CreateEvent (,FALSE ) :将事件对象的开始状态设置为无信号。
SetEvent () :手动将事件对象的状态设置为有信号。
二、详细介绍:
SetEvent ()配置事件为有信号状态时,为线程就执行完毕了!!
OOLsetevent(HandleHevent );
其中hEvent表示句柄,返回值:如果操作成功,则返回非零值,否则返回0。
说明将事件的状态设置为标记并释放任何等待线程。
如果事件是手动的,则在调用ResetEvent之前,该事件将保持标记状态。 在这种情况下,将释放多个线程。
如果事件是自动的,则事件将保持标记状态,直到释放线程,并且事件的状态将设置为无标记。
如果线程不等待,则事件将保持标记状态,直到线程释放。
用法在线程中使用SetEvent和WaitForSingleObject
SetEvent/ResetEvent分别将EVENT设为发送信号或不发送信号两种状态。
WaitForSingleObject () )等待参数指定的OBJECT变为信号状态。 OBJECT可以是事件或其他内核对象。 kfdxl创建线程时,实际上该线程是一个循环,如上所述只执行一次。 就这样带来了问题。 如何在那个死循环中找到合适的条件并退出那个死循环呢? 在Windows中多采用事件方式,当然也可以采用其他方式。 本节介绍如何使用事件通知线程执行函数退出。 其实现原理是这样的,在其死循环中不断使用WaitForSingleObject函数检查是否满足事件,如果满足,则终止线程,否则继续执行。 如果在线程中执行被阻止的函数,则在退出线程时,必须将阻止状态设置为非阻止状态。 例如,如果通过一个线程接收网络数据,并且[1]同时使用被阻止的套接字,则在发送事件信号之前必须关闭套接字才能终止该线程。
当然,重要的APP应用程序方面似乎是为了锁定,实现所谓的pv功能而使用的。
在调用过程中,所有线程都可以在一个等待函数中指定事件对象句柄。 如果指定对象的状态设置为有信号状态,则单对象等待函数将返回。
对于多对象等待函数,可以指定任意或所有指定对象处于有信号状态。 等待函数返回时,将释放线程并继续执行。
初始状态由bInitialState参数设定。 使用SetEvent函数将事件对象的状态设置为有信号的状态。 使用ResetEvent函数将事件对象的状态设置为无信号状态。
如果手动恢复的事件对象的状态设置为信号量状态,则对象的状态将保持信号量状态,直到显式调用ResetEvent函数将其置于无符号状态。
如果事件的对象设置为有信号状态,则会释放任意数量的等待线程和随后开始等待的线程。
如果自动恢复的事件对象的状态设置为有信号状态,则该对象的状态将一直保持有信号状态,直到释放线程。 此函数将自动设置为无符号。 如果线程不等待,事件对象的状态将保持为信号状态。
多个进程可以具有同一事件对象的多个句柄,通过该对象可以实现进程之间的同步。 可以使用以下对象共享机制:
在CreateEvent函数中,lpEventAttributes参数指定当句柄可继承时,由CreateProcess函数创建的子进程继承的事件对象句柄。
流程可以通过在DuplicateHandle函数中指定事件对象句柄来获取复制句柄。 其他进程可以使用此句柄。
流程可以通过为OpenEvent或CreateEvent函数提供名称来获取有名的事件对象句柄。
使用CloseHandle函数关闭句柄。 当进程停止时,句柄将自动关闭。 当最后一个句柄关闭时,事件对象将被丢弃。