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

UptoLike

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

17
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;
function GetNextNumber: Integer;
begin
Result := NextNumber;// Функция возвращает глобальную переменную
Inc(NextNumber); // Инкремент глобальной переменной
end;
procedure TFooThread.Execute;
var
i: Integer;
begin
OnTerminate : = MainForm.ThreadsDone;
for i := 1 to MaxSize do
begin
GlobalArray[i]:=GetNextNumber;// Устанавливаем элемент массива
Sleep (5); // Позволяем потокам "перемешаться"
end;
end;
procedure TMainForm.ThreadsDone(Sender: TObject);
var
i: Integer;
begin
Inc(DoneFlags);
if DoneFlags = 2 then // Оба потока завершены
for i := 1 to MaxSize do
{Заполняем список элементами массива}
Listboxl.Items.Add(IntToStr(GlobalArray[i]));
end;
procedure TMainForm.ButtonlClick(Sender: TObject);
begin
TFooThread.Create(False); // Создаем потоки
TFooThread.Create(False);
end;
end.
                                  17
 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;

function GetNextNumber: Integer;
begin
  Result := NextNumber;// Функция возвращает глобальную переменную
  Inc(NextNumber);       // Инкремент глобальной переменной
end;

procedure TFooThread.Execute;
var
  i: Integer;
begin
  OnTerminate : = MainForm.ThreadsDone;
  for i := 1 to MaxSize do
  begin
    GlobalArray[i]:=GetNextNumber;// Устанавливаем элемент массива
    Sleep (5);                  // Позволяем потокам "перемешаться"
  end;
end;

procedure TMainForm.ThreadsDone(Sender: TObject);
var
  i: Integer;
begin
  Inc(DoneFlags);
  if DoneFlags = 2 then // Оба потока завершены
  for i := 1 to MaxSize do
  {Заполняем список элементами массива}
  Listboxl.Items.Add(IntToStr(GlobalArray[i]));
end;

procedure TMainForm.ButtonlClick(Sender: TObject);
begin
  TFooThread.Create(False); // Создаем потоки
  TFooThread.Create(False);
end;

end.