创建多线程程序并且同步线程,我们需要首先理解一些东西,比如临界区和互斥等概念,楼主可查相关基础资料得到这些,在DLEPHI中我们要用到与临界区和互斥相关的函数如下: EnterCriticalSection() LeaveCriticalSection() DeleteCriticalSection() InitializeCriticalSection()等等, 举一个例子下如:unit Main;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TMainForm = class(TForm) Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private procedure ThreadsDone(Sender: TObject); end; TFooThread = class(TThread) protected procedure Execute; override; end;var MainForm: TMainForm;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; // return global var inc(NextNumber); // inc global var end;procedure TFooThread.Execute; var i: Integer; begin OnTerminate := MainForm.ThreadsDone; EnterCriticalSection(CS); // CS begins here for i := 1 to MaxSize do begin GlobalArray[i] := GetNextNumber; // set array element Sleep(5); // let thread intertwine end; LeaveCriticalSection(CS); // CS ends here end;procedure TMainForm.ThreadsDone(Sender: TObject); var i: Integer; begin inc(DoneFlags); if DoneFlags = 2 then begin // make sure both threads finished for i := 1 to MaxSize do { fill listbox with array contents } Listbox1.Items.Add(IntToStr(GlobalArray[i])); DeleteCriticalSection(CS); end; end;procedure TMainForm.Button1Click(Sender: TObject); begin InitializeCriticalSection(CS); TFooThread.Create(False); // create threads TFooThread.Create(False); end;end.
EnterCriticalSection()
LeaveCriticalSection()
DeleteCriticalSection()
InitializeCriticalSection()等等,
举一个例子下如:unit Main;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TMainForm = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
procedure ThreadsDone(Sender: TObject);
end; TFooThread = class(TThread)
protected
procedure Execute; override;
end;var
MainForm: TMainForm;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; // return global var
inc(NextNumber); // inc global var
end;procedure TFooThread.Execute;
var
i: Integer;
begin
OnTerminate := MainForm.ThreadsDone;
EnterCriticalSection(CS); // CS begins here
for i := 1 to MaxSize do
begin
GlobalArray[i] := GetNextNumber; // set array element
Sleep(5); // let thread intertwine
end;
LeaveCriticalSection(CS); // CS ends here
end;procedure TMainForm.ThreadsDone(Sender: TObject);
var
i: Integer;
begin
inc(DoneFlags);
if DoneFlags = 2 then
begin // make sure both threads finished
for i := 1 to MaxSize do
{ fill listbox with array contents }
Listbox1.Items.Add(IntToStr(GlobalArray[i]));
DeleteCriticalSection(CS);
end;
end;procedure TMainForm.Button1Click(Sender: TObject);
begin
InitializeCriticalSection(CS);
TFooThread.Create(False); // create threads
TFooThread.Create(False);
end;end.