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.
Результаты программы:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.