态转换”信息。所以其本质是用来通知某事已经发生的信号,在这里可用来表示共享资源已
经在使用或已经使用完的信号。
(1).使用CreateEvent()API函数
使用CreateEvent()创建一个事件,声明如下:
functionCreateEvent(lpEventAttributes:PSecurityAttributes;
bManualReset,bInitialState:BOOL;lpName:PWideChar):THandle;stdcall;
其中bManualReset参数代表创建的Event是自动复位还是人工复位,如果设为True表示
人工复位,一旦该Event被设置为有信号,则它一直会等到手动执行ResetEvent()时才会
变为无信号,设为False表示自动复位,Event被设置为有信号时,则当有一个线程执行
WaitForSingleObject()时该Event就会自动复位,变成无信号。bInitialState参数代表事件
的初始状态,设为True,事件创建后为有信号,设为False则为无信号。
不同于互斥或信号量,Event不使用Release相关函数设置相关对象进入发信号状态,而使
用SetEvent()函数,当线程执行完同步代码要从同步区域中离开时应执行该函数,声明如
下:
functionSetEvent(hEvent:THandle):BOOL;stdcall;
当事件创建为人工复位时,程进入同步区域执行同步代码前应执行ResetEvent()函数,
将Event设为无信号。声明如下:
functionResetEvent(hEvent:THandle):BOOL;stdcall;
PulseEvent()是一个比较有意思的方法,正如名字,它使一个Event对象的状态发生一次
脉冲变化,将无信号设为有信号,唤醒等待的线程,再设为无信号,而整个操作是原子的。
对自动复位的Event对象,它仅唤醒第一个等到该事件的线程(如果有的话),而对于人工复
位的Event对象,它唤醒所有等待的线程。声明如下:
functionPulseEvent(hEvent:THandle):BOOL;stdcall;
当使用完事件时,应当调用CloseHandle()来关闭它。
(2).使用TEvent类
TEvent是在SyncObjs单元中定义的类,其是ThandleObject类的子类,要使用它需要先
usesSyncObjs。它对上面的API函数进行了封装,简化并方便了在Delphi中的使用。
TEvent若在多线程环境中可用于与其它线程同步;若在单线程环境中可用于调整响应不同
异步事件(如系统消息或用户动作)的代码段。构造函数如下:
constructorCreate(EventAttributes:PSecurityAttributes;ManualReset:Boolean;
InitialState:Boolean;constName:string;UseCOMWait:Boolean=False);overload;
11
constructorCreate(UseCOMWait:Boolean=False);overload;
ManualReset参数为是否手工复位,InitialState参数为初始状态。
TEvent.SetEvent()和TEvent.ResetEvent()均无参数。
TEvent类中没有定义与PulseEvent功能一样的方法。
TEvent类同样可以使用WaitFor()和WaitForMultiple()函数。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32871-21.html
让这帮家伙丢丢丑
欢迎来中国南海玩