Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС СФМЭИ.doc
Скачиваний:
22
Добавлен:
17.09.2019
Размер:
1.37 Mб
Скачать

7.3.1 Пример 2

С помощью объектов синхронизации Windows создать модель вычислительной сети. Сеть состоит из одного сервера, к которым обращаются с запросами клиенты. Запросы клиентов поступают через случайные промежутки времени. У сервера ограниченный размер числа одновременно обрабатываемых запросов. Запрос каждого клиента обрабатывается в течение некоторого времени.

Данное приложение работает следующим образом: имеется два потока Thread1 и Thread 2. Поток Thread2 принимает запрос клиента, поток Thread1 реализует процесс обслуживания очередного запроса на сервере. Количество одновременно обслуживаемых запросов регулируется семафором. Приложение, реализующее данную задачу изображено на рисунке 7.2.

Для создания данного выполните следующие действия:

  1. Объявите глобальные переменные:

var

Form1: TForm1;

//Дескриптор потока, создающего поток Thread2

hThread2:THandle;

// Массив потоков обслуживания запросов клиентов

hThread1:Array[0..1000] of THandle;

// Идентификаторы соответствующих потоков

ThreadId2:DWORD;

ThreadId1:Array[0..1000] of DWORD;

// Дескриптор семафора

serv1:tHandle;

// Номер очередного поступившего запроса

q:Integer;

// Максимально допустимое число запросов

zapr:Integer;

  1. Создайте процедуру Thread1, следующего вида:

procedure Thread1;

Var q1:Integer;

Begin

// Запомнить номер очередного обрабатываемого запроса

q1:=q;

// Если сервер свободен , запрос обрабатывается

WaitForSingleObject(serv1,INFINITE);

// Запрос обрабатывается при условии,

// что номер запроса - положительное число

If q1>0 then

Begin

// Случайное время выполнения звапроса

Sleep(1000+Random(2000));

// Вывод информации о завершении обработки запроса с номером q1

Form1.Memo1.Lines.Add('Обработан запрос номер '+IntToStr(q1));

end;

// Сервер освобождается для обработки других запросов

ReleaseSemaphore(serv1,1,nil);

end;

  1. Создайте процедуру Thread1, следующего вида:

procedure Thread2;

begin

// Создается очередной запрос, если общее число созданных запросов

// меньше числа zapr, вводимого с клавиатуры

While q<zapr do

Begin

// Запросы поступают через случайный интервал времени

Sleep(100+Random(200));

// Увеличиваем на 1 число поступивших запросов

q:=q+1;

Form1.Edit3.Text:=IntToStr(q);

// Создаем поток, для обслуживания поступившего запроса

hThread1[q]:=CreateThread(nil,0,@Thread1,nil,0,ThreadID1[q]);

end;

end;

  1. Для события OnClick кнопки Button1 введите следующий программный код:

procedure TForm1.Button1Click(Sender: TObject);

Var

res:Integer;

begin

Memo1.Clear;

// очищаем счетчик числа поступивших запросов

q:=0;

// ввод числа одновременно обслуживаемых на сервере запросов

// это число требуется для настройки семафора

res:=StrToInt(Edit1.text);

// ввод максимального числа запросов

zapr:=StrToInt(Edit2.text);

// создание семафора

serv1:=CreateSemaphore(nil,res,res,nil);

// создание потока, предназначенного для приема запросов клиентов

hThread2:=CreateThread(nil,0,@Thread2,nil,0,ThreadID2);

end;

  1. Для события OnClick кнопки Button2 введите следующий программный код:

procedure TForm1.Button2Click(Sender: TObject);

begin

Application.Terminate;

end;

  1. Откомпилируйте приложение и проверьте его работу.