НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра ССОД
Расчетно-графическая работа
по дисциплине «Операционные системы»
Вариант №9
Факультет: АВТ Преподаватель
Группа: АИ-72 Родников В.В.
Студент: Чепарухина А.Ю.
Отметка о защите:
________________
Дата защиты:
«____»___________2009г.
Новосибирск,2009
Содержание
стр.
Работа программы……………………………..………………………….……. 3
Общая схема работы программы……………………..……………………….. 3
Описание основных функций…………………………………….…………… 4
Листинги ………………………………………………………….……………. 7
Список литературы …………………………………………………………… 13
Задание:
Написать программу, моделирующую работу кассы приема платежей.
Количество работающих кассиров (1, 2 или 3) выбирается переключателем.
Работа каждого кассира моделируется отдельным потоком, время обслуживания каждого клиента определяется генератором случайных чисел
в диапазоне 30 – 200 сек.
На главной форме визуально должны динамически отображаться:
- количество обслуживаемых в данный момент клиентов;
- количество клиентов в общей очереди;
- состояние каждого кассира (занят-свободен);
если он занят – время, оставшееся до окончания
обслуживания очередного клиента (секунд).
Объекты синхронизации выбираются самостоятельно.
Работа программы:
Принцип работы программы заключается в следующем:
Критическая секция (critical section) — это небольшой участок кода, требующий монопольного доступа к каким-то общим данным. Она позволяет сделать так, чтобы единовременно только один поток получал доступ к определенному ресурсу.
В своей программе при помощи кнопки Button3- «Пуск» и переключателя RadioGroup1 создаем потоки от 1 до 3-х, которые одновременно могут обслуживать только по одному клиенту.
Запуская потоки, уменьшается число клиентов в очереди и запускается таймер, который показывает время, оставшееся до освобождения кассы.
Количество клиентов можно увеличить при помощи Button2-«Добавить людей в очередь».
Работу запущенных потоков можно приостановить кнопками PauseBtn1, PauseBtn2 и соответственно PauseBtn3.
Общая схема работы программы:
Описание основных функций:
Преимущество критических секций в том, что они просты в использовании и выполняются очень быстро, так как реализованы на основе Interlocked-функций.
Рис.1. Главная форма программы.
На данной форме осуществляется управление моделью «касс приема платежей».
- Функция FormCreate. Создаем критическую секцию, задаем интервал времени, указываем место нахождения картинок.
void __fastcall TBankForm::FormCreate(TObject *Sender)
{
InitializeCriticalSection(&Sect1);
Timer1->Interval = MAX_TIME;
WorkDir = ExtractFileDir(ParamStr(0));
PictureDir = WorkDir + AnsiString("\\pictures");
}
- Функция отсчета окончания времени обслуживания клиента.
void __fastcall TBankForm::Timer1Timer(TObject *Sender)
{
//n1, n2, n3- счетчики, нужные для отсчета времени обслуживания
if(n1 == 0)
{
n1 = 0;
if(in_queue==0) BankForm->Terminal1->Picture->LoadFromFile("pictures\\apparat.jpg");
}
else
{
n1--;
Time1->Caption = n1;
}
if(n2 == 0)
{
n2 = 0;
if(in_queue==0) BankForm->Terminal2->Picture->LoadFromFile("pictures\\apparat.jpg");
}
else
{
n2--;
Time2->Caption = n2;
}
if(n3 == 0)
{
n3 = 0;
if(in_queue==0) BankForm->Terminal3->Picture->LoadFromFile("pictures\\apparat.jpg");
}
else
{
n3--;
Time3->Caption = n3;
}
}
Листинги:
Листинг заголовочного файла программы:
//---------------------------------------------------------------------------
#ifndef MainUnitH
#define MainUnitH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <jpeg.hpp>
//---------------------------------------------------------------------------
class TBankForm : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TRadioGroup *RadioGroup1;
TEdit *Edit1;
TLabel *Label1;
TButton *Button2;
TButton *Button3;
TButton *PauseBtn3;
TButton *PauseBtn2;
TButton *PauseBtn1;
TTimer *Timer1;
TImage *Image1;
TImage *Terminal1;
TLabel *T1Label;
TLabel *Time1;
TImage *Terminal2;
TImage *Terminal3;
TLabel *T2Label;
TLabel *T3Label;
TLabel *Time2;
TLabel *Time3;
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall PauseBtn1Click(TObject *Sender);
void __fastcall PauseBtn2Click(TObject *Sender);
void __fastcall PauseBtn3Click(TObject *Sender);
void __fastcall Timer1Timer(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TBankForm(TComponent* Owner);
static DWORD WINAPI Potok1(LPVOID param);
static DWORD WINAPI Potok2(LPVOID param);
static DWORD WINAPI Potok3(LPVOID param);
};
//---------------------------------------------------------------------------
extern PACKAGE TBankForm *BankForm;
//---------------------------------------------------------------------------
#endif
Листинг файла MainUnit.cpp программы:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#define MAX_TIME 1000
#include "MainUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TBankForm *BankForm;
int in_queue = 10;
bool pause1 = false;
bool pause2 = false;
bool pause3 = false;
int n1 = 0; //Счетчики - нужны для отсчета времени обслуживания
int n2 = 0;
int n3 = 0;
TRTLCriticalSection Sect1; // Оболочка структуры описания критической секции
HANDLE hKassa1; //Первая касса
HANDLE hKassa2; //Вторая касса
HANDLE hKassa3; //Третья касса
AnsiString WorkDir, PictureDir;
AnsiString NameFile;
//---------------------------------------------------------------------------
__fastcall TBankForm::TBankForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TBankForm::Button2Click(TObject *Sender)
{
in_queue = Edit1->Text.ToInt() + 1;
Edit1->Text = in_queue;
}
//---------------------------------------------------------------------------
void __fastcall TBankForm::Button3Click(TObject *Sender)
{
in_queue = Edit1->Text.ToInt();
//Создаем потоки
switch(RadioGroup1->ItemIndex)
{
case 0:
//Стартуем вторичный поток
hKassa1 = CreateThread(NULL,0,Potok1,NULL,0,NULL);
NameFile = PictureDir + AnsiString("\\money.jpg");
BankForm->Terminal1->Picture->LoadFromFile(NameFile.c_str());
break;
case 1:
//Стартуем вторичный поток
if(!hKassa1) hKassa1 = CreateThread(NULL,0,Potok1,NULL,0,NULL);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.