Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТВП Конечные и двоичные автоматы.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
144 Кб
Скачать
☆

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

Программа состоит из трех частей:

— программа «Barber»:

— программа «Hall»;

— программа «Main». Необходимо запускать ее. В ней создаются процессы «Парикмахер» и «Клиент».

Клиент заходит в парикмахерскую, если скамья свободна, то он проверяет, свободен ли парикмахер. Если парикмахер свободен – садится к нему в кресло. Если парикмахер занят – занимает место на скамейке и ждет своей очереди в кресло парикмахера. Дождавшись своей очереди, клиент освобождает место на скамье и занимает место в кресле, в случае, когда парикмахер уснул, клиент будит его. Когда скамья занята, вновь прибывший клиент уходит.

Далее представлены основные фрагменты кода программы (язык С++).

2.3.1 Фрагмент программы «Barber»

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Barber.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TFormBarber *FormBarber;

//Дескрипторы

HANDLE hSemaforBench;

HANDLE hSemaforSeat;

HANDLE hMutex;

HANDLE hEventBarber;

HANDLE hEventCustomer;

HANDLE hThreadBarber;

DWORD dThreadBarber;

int cMax = 5;

DWORD WINAPI BarberW(LPVOID);

//---------------------------------------------------------------------------

__fastcall TFormBarber::TFormBarber(TComponent* Owner)

: TForm(Owner)

{

FormBarber->State->Text = "Sleep";

//поток для функции BarberW(LPVOID)

hThreadBarber = CreateThread(NULL, 0, BarberW, 0, 0, &dThreadBarber);

}

//---------------------------------------------------------------------------

DWORD WINAPI BarberW(LPVOID)

{

hMutex = CreateMutex(NULL, TRUE, "myMutex");

hSemaforSeat = CreateSemaphore(NULL, 1, 1, "Seat");

hSemaforBench = CreateSemaphore(NULL, cMax, cMax, "Bench");

hEventBarber = CreateEvent(NULL, FALSE, FALSE, "myEventBarber");

hEventCustomer = CreateEvent(NULL, FALSE, FALSE, "myEventCustomer");

ReleaseMutex(hMutex);

int count = 0;

const int time = 5;

while (1)

{

while (1)

{

if (WaitForSingleObject(hEventBarber, 1) == WAIT_OBJECT_0)

{

count = 0;

ReleaseSemaphore(hSemaforBench,1,NULL);

break;

}

count++;

Sleep(2000);

if (count == time/2)

FormBarber->State->Text = "Wait";

if (count == time)

{

FormBarber->State->Text = "Sleep";

WaitForSingleObject(hEventBarber, INFINITE);

Sleep(1000);

break;

}

}

count = 0;

int a;

a = random(3);

FormBarber->State->Text = "Cutting";

for (int i = 0; i <= 100; i++)

{

FormBarber->ProgressBarBarber->Position = i;

Sleep(70);

}

SetEvent(hEventCustomer);

FormBarber->ProgressBarBarber->Position = 0;

FormBarber->State->Text = "Next";

Sleep(500);

ReleaseSemaphore(hSemaforSeat, 1, NULL);

}

CloseHandle(hMutex);

CloseHandle(hSemaforSeat);

CloseHandle(hSemaforBench);

}

2.3.2 Фрагмент программы «Hall»

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Hall_2.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TFormHall *FormHall;

HANDLE hMutex;

HANDLE hSemaforSeat;

HANDLE hSemaforBench;

HANDLE hEventCustomer;

HANDLE hEventBarber;

DWORD WINAPI Hall(LPVOID);

TMemo* memo[5];

void HallCreate();

HANDLE hThread[5];

DWORD idThread[5];

//---------------------------------------------------------------------------

__fastcall TFormHall::TFormHall(TComponent* Owner)

: TForm(Owner)

{ FormHall->State->Text = "Free";

memo[1] = FormHall->Memo1;

memo[2] = FormHall->Memo2;

memo[3] = FormHall->Memo3;

memo[4] = FormHall->Memo4;

for (int i = 1; i <= 4; i++) {memo[i]->Text = "";}

}

//---------------------------------------------------------------------------

DWORD WINAPI Hall(LPVOID)

{

hMutex = OpenMutex(SYNCHRONIZE, FALSE, "myMutex");

WaitForSingleObject(hMutex, INFINITE);

hSemaforSeat = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Seat");

hSemaforBench = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Bench");

hEventCustomer = OpenEvent(SYNCHRONIZE, FALSE, "myEventCustomer");

hEventBarber = OpenEvent(EVENT_MODIFY_STATE, FALSE, "myEventBarber");

int k = 0;

if (WaitForSingleObject(hSemaforBench, 1) != WAIT_OBJECT_0)

{

Sleep(1400);

FormHall->State->Text = "No Plases";

ReleaseMutex(hMutex);

return 0;

}

else

if (WaitForSingleObject(hSemaforSeat, 1) != WAIT_OBJECT_0)

{

for (int i = 1; i < 5; i++)

if (memo[i]->Text == "")

{

k = i;

memo[i]->Text = "Wait";

break;

}

ReleaseMutex(hMutex);

WaitForSingleObject(hSemaforSeat, INFINITE);

}

else{ReleaseMutex(hMutex);}

SetEvent(hEventBarber);

memo[k]->Text = "Go";

Sleep(700);

memo[k]->Text = "";

ReleaseSemaphore(hSemaforBench,1,NULL);

FormHall->barber->Text = "Cutting";

WaitForSingleObject(hEventCustomer, INFINITE);

FormHall->barber->Text = "Next";

Sleep(1000);

return 0;

}

void HallCreate()

{

FormHall->Timer1->Enabled = false;

randomize();

static int a;

DWORD lpExitCode;

a = random(2);

if (a == 1) {

for (int i = 1; i <= 4; i++)

{

if (hThread[i] == NULL)

{

hThread[i] = CreateThread(NULL, 0, Hall, 0, 0, &idThread[i]);

break;

}

else

{

GetExitCodeThread(hThread[i], &lpExitCode);

if (lpExitCode != STILL_ACTIVE)

{

CloseHandle(hThread[i]);

hThread[i] = CreateThread(NULL, 0, Hall, 0, 0, &idThread[i]);

break;

}

}

} }

FormHall->Timer1->Enabled =true;

return;

}

//---------------------------------------------------------------------------

void __fastcall TFormHall::FormCreate(TObject *Sender)

{

for (int i = 1; i < 5; i++)

memo[i]->Visible = true;

Timer1->Interval = 400;

Timer1->Enabled =true;

HallCreate();

}

//---------------------------------------------------------------------------

void __fastcall TFormHall::Timer1Timer(TObject *Sender)

{

HallCreate();

}

//---------------------------------------------------------------------------