Создание многопоточных приложений. Копытин А.В - 19 стр.

UptoLike

Составители: 

19
procedure ButtonlClick(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: TCriticalSection;
function GetNextNumber: Integer;
begin
Result := NextNumber;
inc(NextNumber);
end;
procedure TFooThread.Execute;
var
i: Integer;
begin
OnTerminate : = MainForm.ThreadsDone;
CS.Enter; // Начало критического раздела
try
for i := 1 to MaxSize do
begin
GlobalArray[i] := GetNextNumber;
Sleep(5);
end;
finally
CS.Leave; // Конец критического раздела
end;
end;
procedure TMainForm.ThreadsDone(Sender: TObject);
var
i: Integer;
begin
inc(DoneFlags);
if DoneFlags = 2 then
begin
for i := 1 to MaxSize do
Listboxl.Items.Add(IntToStr(GlobalArray[i]));
                                 19
    procedure                       ButtonlClick(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: TCriticalSection;
function GetNextNumber: Integer;
begin
  Result := NextNumber;
  inc(NextNumber);
end;

procedure TFooThread.Execute;
var
  i: Integer;
begin
  OnTerminate : = MainForm.ThreadsDone;
  CS.Enter;       // Начало критического раздела
  try
    for i := 1 to MaxSize do
    begin
      GlobalArray[i] := GetNextNumber;
      Sleep(5);
    end;
  finally
  CS.Leave;     // Конец критического раздела
  end;
end;

procedure TMainForm.ThreadsDone(Sender: TObject);
var
  i: Integer;
begin
  inc(DoneFlags);
  if DoneFlags = 2 then
  begin
    for i := 1 to MaxSize do
    Listboxl.Items.Add(IntToStr(GlobalArray[i]));