dephi線程的同步,最簡單的就是臨界區。 臨界區的意思就是,一次只能由一個線程執行的代碼。 在使用臨界區之前,必須使用InitializeCriticalSection( )過程來初始化它。 其聲明如下: procedure InitializeCriticalSection(var lpCriticalSection);stdcall; lpCriticalSection參數是一個TRTLCriticalSection類型的記錄,並且是變參。至於TRTLCriticalSection 是如何定義的,這並不重要,因為很少需要查看這個記錄中的具體內容。只需要在lpCriticalSection中傳 遞未初始化的記錄,InitializeCriticalSection()過程就會填充這個記錄. 在記錄被填充後,我們就可以開始創建臨界區了。這時我們需要用 E n t e r C r i t i c a l S e c t i o n ( )和L e a v e C r i t i c a l S e c t i o n ( )來封裝代碼塊. 當你不需要T RT L C r i t i c a l S e c t i o n記錄時,應當調用D e l e t e C r i t i c a l S e c t i o n ( )過程,下面是它的聲明: procedure DeleteCriticalSection(var lpCriticalSection: TRT L C r i t i c a l S e c t i o n ) ; s t d c a l l ; 列子: [delphi] unit CriticaSection; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm2 = class(TForm) btn1: TButton; lstbox1: TListBox; procedure btn1Click(Sender: TObject); public procedure ThreadsDone(Sender : TObject); end; TFooThread=class(TThread) protected procedure Execute;override; end; var Form2: TForm2; implementation {$R *.dfm} const MAXSIZE=128; var NextNumber : Integer=0; DoneFlags : Integer=0; GlobalArray : array[1..MAXSIZE] of Integer; CS : TRTLCriticalSection; function GetNextNumber:Integer; begin Result:=NextNumber; Inc(nextnumber); end; { TForm2 } procedure TForm2.btn1Click(Sender: TObject); begin // InitializeCriticalSection(CS); TFooThread.Create(False); TFooThread.Create(False); end; procedure TForm2.ThreadsDone(Sender: TObject); var i:Integer; begin Inc(DoneFlags); if DoneFlags=2 then for I := 1 to MAXSIZE do lstbox1.Items.Add(IntToStr(GlobalArray[i])); DeleteCriticalSection(CS); end; { TFooThread } procedure TFooThread.Execute; var i:Integer; begin EnterCriticalSection(cs); OnTerminate:=Form2.ThreadsDone; for I := 1 to MAXSIZE do begin www.2cto.com GlobalArray[i]:=GetNextNumber; end; LeaveCriticalSection(CS); end; end. 這樣就可以是線程同步,不會發生沖突。