Модифицирование программы „Гонки” (Лабораторная работа № 4)

Страницы работы

Содержание работы

4-я лабораторная

Задание:

Модифицировать программу „Гонки” так, чтобы она работала правильно.

Ход работы:

·  Открыли Delphi-проект Gonki.dpr.

·  Инициировали в процедуре создания потоков критическую секцию функцией Win32 API InitializeCriticalSection(CS).

·  Добавили в объявление переменных параметр CS, который представляет собой запись типа TRTLCriticalSection. Запись CS передается по ссылке.

·  А теперь самое главное - объявли начало и конец критической секции. Понятно, что запись CS заполняет функцией Win32 API InitializeCriticalSection.

·  И, наконец, когда запись CS не нужна, освободили занимаемую ею память.

·  Сохранили приложение под именем CritSec, запустили его и увидели, что оно работает так, как мы его задумывали:

Листинг программы:

const

  MaxSize = 128;

var

  NextNumber: Integer = 0;

  DoneFlags: Integer = 0;

  GlobalArray: array[1..MaxSize] of Integer;

  CS: TRTLCriticalSection;

function GetNextNumber: Integer;

begin

  inc(NextNumber);

  Result := NextNumber;

end;

procedure TFooThread.Execute;

var

  i: Integer;

begin

  OnTerminate := Form1.DispGlblArr;

  EnterCriticalSection(CS);

  for i := 1 to MaxSize do

  begin

    GlobalArray[i] := GetNextNumber;

    Sleep(5);

  end;

  LeaveCriticalSection(CS);

end;                             

procedure TForm1.DispGlblArr(Sender: TObject);

var

  i: Integer;

begin

  inc(DoneFlags);

  if DoneFlags = 2 then

  begin // make sure both threads finished

    for i := 1 to MaxSize do

      Listbox1.Items.Add(IntToStr(GlobalArray[i]));

      DeleteCriticalSection(CS);      {OTL from hurry}

  end;

end;

procedure TForm1.CreateThrd(Sender: TObject);

begin

  InitializeCriticalSection(CS);

  TFooThread.Create(False);

  TFooThread.Create(False);

end;

end.

Результаты программы:

Похожие материалы

Информация о работе

Тип:
Отчеты по лабораторным работам
Размер файла:
35 Kb
Скачали:
0