程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> delphi 線程同步 臨界區

delphi 線程同步 臨界區

編輯:Delphi

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.     這樣就可以是線程同步,不會發生沖突。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved