量计数值。实际执行ReleaseSemaphore(FHandle,AReleaseCount,@Result),其中@Result是
指向Release函数返回值Integer类型的指针。如果要指定增加计数值应使用第二个版本。
4.Event事件
事件(Event)与Delphi中的事件有所不同。从本质上说,Event其实相当于一个全局的布
尔变量。它有两个赋值操作:SetEvent和ResetEvent,相当于把它设置为True或False。
而检查它的值是通过WaitForSingleObject()(或其它WaitFor函数)操作进行。SetEvent和
ResetEvent操作是原语操作,所以Event可以实现一般布尔变量不能实现的在多线程中的
应用。
当Event从Reset状态向Set状态转换时,唤醒其它挂起的线程,这就是它为什么叫
Event的原因。所谓“事件”就是指“状态的转换”。通过Event可以程间传递这种“状
态转换”信息。所以其本质是用来通知某事已经发生的信号,在这里可用来表示共享资源已
经在使用或已经使用完的信号。
(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中的使用。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32871-9.html
也不能再拖了