- •Курсовая работа
- •1 Теоретический вопрос «Конечные автоматы. Двоичные автоматы.»
- •Введение
- •1.2 Способы задания автоматов Мили
- •1.2.1 Табличный способ
- •1.2.2 Графический способ
- •1.3 Элементарные автоматы
- •2.1 Постановка задачи
- •2.2Реализация задачи с помощью сетей Петри
- •1.4 Вывод
- •2 Решение задачи «о спящем парикмахере»
- •2.3 Листинг программы
- •2.3.1 Фрагмент программы «Barber»
- •2.3.2 Фрагмент программы «Hall»
- •2.3.3 Фрагмент программы «Main»
- •3 Список использованных источников
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();
}
//---------------------------------------------------------------------------
