end;
procedureTForm1.FormDestroy(Sender:TObject);
begin
CloseHandle(HSem);//销毁信号量
end;
procedureTForm1.Button1Click(Sender:TObject);
var
index:Integer;
begin
forindex:=0to10do
TMyThread.Create;
end;
(2).使用TSemaphore类
TSemaphore是在SyncObjs单元中定义的类,其是ThandleObject类的子类,要使用它需
要先usesSyncObjs。它对上面的API函数进行了封装,简化并方便了在Delphi中的使
用。
其有三个版本的构造器,简单执行TSemaphore.Create就可实例化一个对象:
constructorCreate(UseCOMWait:Boolean=False);overload;
constructorCreate(SemaphoreAttributes:PSecurityAttributes;AInitialCount:Integer;
AMaximumCount:Integer;constName:string;UseCOMWait:Boolean=False);overload;
constructorCreate(DesiredAccess:LongWord;InheritHandle:Boolean;
constName:string;UseCOMWait:Boolean=False);overload;
参数参见上面介绍。
TSemaphore.Acquire等效于WaitForSingleObject(semaphorehandle,INFINITE),其实际上就
是执行THandleObject.WaitFor(INFINITE)。或者使用WaitFor()和WaitForMultiple()函数,
这两个函数可以设置等待的时间或等待多个事件对象。
TSemaphore.Release有两个版本,声明如下:
procedureRelease;override;overload;
functionRelease(AReleaseCount:Integer):Integer;overload;reintroduce;
第一个版本实际执行ReleaseSemaphore(FHandle,1,nil)
第二个版本AReleaseCount参数表示释放时增加的信号量计数值,返回值是释放前的信号
量计数值。实际执行ReleaseSemaphore(FHandle,AReleaseCount,@Result),其中@Result是
10
指向Release函数返回值Integer类型的指针。如果要指定增加计数值应使用第二个版本。
4.Event事件
事件(Event)与Delphi中的事件有所不同。从本质上说,Event其实相当于一个全局的布
尔变量。它有两个赋值操作:SetEvent和ResetEvent,相当于把它设置为True或False。
而检查它的值是通过WaitForSingleObject()(或其它WaitFor函数)操作进行。SetEvent和
ResetEvent操作是原语操作,所以Event可以实现一般布尔变量不能实现的在多线程中的
应用。
当Event从Reset状态向Set状态转换时,唤醒其它挂起的线程,这就是它为什么叫
Event的原因。所谓“事件”就是指“状态的转换”。通过Event可以程间传递这种“状
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32871-20.html