procedureLeaveCriticalSection(varlpCriticalSection:TRTLCriticalSection);stdcall;//离开临界
区
正如你所想的,参数lpCriticalSection就是由InitializeCriticalSection()填充的记录。
如果在某个子线程执行EnterCriticalSection()前,已经有另一个线程进入临界区且还未离
开临界区,则该子线程将挂起并无限期等待另一个线程离开临界区,要想不挂起且0时间
等待,必须使用TryEnterCriticalSection()。该过程声明如下:
functionTryEnterCriticalSection(varlpCriticalSection:TRTLCriticalSection):BOOL;stdcall;
TryEnterCriticalSection()不同于EnterCriticalSection()的声明在于多出一个布尔型的返回
值,如果返回True代表成功进入临界区,如果返回False代表临界区已占用且不进入临界
区。运用这个函数,线程能够迅速查看它是否可以访问某个共享资源,如果不能访问,那么
它可以继续执行某些其他操作,而不必进行等待。
使用TryEnterCriticalSection(),必须判断其返回值。
当你不需要临界区时,应当调用DeleteCriticalSection()过程删除临界区,该函数多半在窗
体销毁时或程序终止前执行。下面是它的声明:
procedureDeleteCriticalSection(varlpCriticalSection:TRTLCriticalSection);stdcall;
例:
type
TMyThread=class(TThread)
protected
procedureExecute;override;
public
constructorCreate;virtual;
end;
var
Form1:TForm1;
CriticalSection:TRTLCriticalSection;//定义临界区
implementation
{$R*.dfm}
var
tick:Integer=1;
procedureTMyThread.Execute;
begin
EnterCriticalSection(CriticalSection);//进入临界区
try
Form1.Edit1.Text:=IntToStr(tick);
Inc(tick);
Sleep(10);
finally
LeaveCriticalSection(CriticalSection);//离开临界区
end;
end;
constructorTMyThread.Create;
begin
inheritedCreate(False);
FreeOnTerminate:=True;
end;
procedureTForm1.RzButton1Click(Sender:TObject);
var
index:Integer;
begin
forindex:=0to15do
TMyThread.Create;
end;
procedureTForm1.FormCreate(Sender:TObject);
begin
InitializeCriticalSection(CriticalSection);//初始化临界区
end;
procedureTForm1.FormDestroy(Sender:TObject);
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32871-2.html
这些人怎么不先反思反思自己