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

UptoLike

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

22
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;
e: TEvent;
function GetNextNumber: Integer;
begin
Result := NextNumber;
inc(NextNumber);
end;
procedure TFooThread.Execute;
var
i: Integer;
res: TWaitResult;
begin
OnTerminate:=MainForm.ThreadsDone;
res:=e.WaitFor(INFINITE);
if res = wrSignaled then
begin
e.ResetEvent; // Сброс события
for i := 1 to MaxSize do
begin
GlobalArray[i] := GetNextNumber;
Sleep(5);
end;
e.SetEvent // Установка события
end;
end;
procedure TMainForm.ThreadsDone(Sender: TObject);
var
i: Integer;
begin
inc(DoneFlags);
if DoneFlags = 2 then
begin
for i := 1 to MaxSize do
Listbox1.Items.Add(IntToStr(GlobalArray[i]));
e.Free; // Освобождение памяти
end;
                                   22
    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;
  e: TEvent;

function GetNextNumber: Integer;
begin
  Result := NextNumber;
  inc(NextNumber);
end;

procedure TFooThread.Execute;
var
  i: Integer;
  res: TWaitResult;
begin
  OnTerminate:=MainForm.ThreadsDone;
  res:=e.WaitFor(INFINITE);
  if res = wrSignaled then
  begin
    e.ResetEvent; // Сброс события
    for i := 1 to MaxSize do
    begin
       GlobalArray[i] := GetNextNumber;
       Sleep(5);
    end;
    e.SetEvent    // Установка события
  end;
end;

procedure TMainForm.ThreadsDone(Sender: TObject);
var
  i: Integer;
begin
  inc(DoneFlags);
  if DoneFlags = 2 then
  begin
    for i := 1 to MaxSize do
    Listbox1.Items.Add(IntToStr(GlobalArray[i]));
    e.Free; // Освобождение памяти
  end;