å çä¸æ®µç¨åº, 代ç æ件:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function MyThreadFun(p: Pointer): DWORD; stdcall;
var
i: Integer;
begin
for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i));
Result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ID: DWORD;
begin
CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Align := alLeft;
end;
end.
çªä½æ件:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 154
ClientWidth = 214
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object ListBox1: TListBox
Left = 9
Top = 9
Width = 121
Height = 97
ItemHeight = 13
TabOrder = 0
end
object Button1: TButton
Left = 131
Top = 112
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 1
OnClick = Button1Click
end
end
å¨è¿æ®µç¨åºä¸, æä¸ä¸ªçº¿ç¨å ä¹æ¯åæ¶å»ºç«, åçªä½ä¸ç ListBox1 ä¸åæ°æ®, æåååºçç»ææ¯è¿æ ·ç:
è½ä¸è½è®©å®ä»¬å«ææ¶, ä¸ä¸ªå®äºå¦ä¸ä¸ªåæ¥? è¿å°±è¦ç¨å°å¤çº¿ç¨çåæ¥ææ¯.
åé¢è¯´è¿, æç®åçåæ¥ææ®µå°±æ¯ "临çåº".
å 说è¿ä¸ª "åæ¥"(Synchronize), é¦å è¿ä¸ªååèµ·çä¸å¥½, æ们好åéè¦çæ¯ "å¼æ¥"; å ¶å®å¼æ¥ä¹ä¸åç¡®...
管å®å«ä»ä¹ååå¢, å®çç®çå°±æ¯ä¿è¯ä¸å²çªãæ次åºãé½åç.
"临çåº"(CriticalSection): å½æä¸æ®µä»£ç æ¾å ¥ä¸ä¸ªä¸´çåº, 线ç¨æ§è¡å°ä¸´çåºæ¶å°±ç¬å äº, è®©å ¶ä»ä¹è¦æ§è¡æ¤ä»£ç ç线ç¨å çç; è¿ååé¢ç¨ç Lock å UnLock å·®ä¸å¤; 使ç¨æ ¼å¼å¦ä¸:
var CS: TRTLCriticalSection; {声æä¸ä¸ª TRTLCriticalSection ç»æç±»ååé; å®åºè¯¥æ¯å
¨å±ç}
InitializeCriticalSection(CS); {åå§å}
EnterCriticalSection(CS); {å¼å§: è½®å°æäºå
¶ä»çº¿ç¨èµ°å¼}
LeaveCriticalSection(CS); {ç»æ: å
¶ä»çº¿ç¨å¯ä»¥æ¥äº}
DeleteCriticalSection(CS); {å é¤: 注æä¸è½è¿æ©å é¤}
//ä¹å¯ç¨ TryEnterCriticalSection æ¿ä»£ EnterCriticalSection.
ç¨ä¸ä¸´çåº, éåä¸é¢ç代ç , è¿è¡ææå¾:
代ç æ件:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
CS: TRTLCriticalSection;
function MyThreadFun(p: Pointer): DWORD; stdcall;
var
i: Integer;
begin
EnterCriticalSection(CS);
for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i));
LeaveCriticalSection(CS);
Result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ID: DWORD;
begin
CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Align := alLeft;
InitializeCriticalSection(CS);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteCriticalSection(CS);
end;
end.
Delphi å¨ SyncObjs åå ç»å°è£ äºä¸ä¸ª TCriticalSection ç±», ç¨æ³å·®ä¸å¤, 代ç å¦ä¸:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses SyncObjs;
var
CS: TCriticalSection;
function MyThreadFun(p: Pointer): DWORD; stdcall;
var
i: Integer;
begin
CS.Enter;
for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i));
CS.Leave;
Result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ID: DWORD;
begin
CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Align := alLeft;
CS := TCriticalSection.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
CS.Free;
end;
end.