Написание программы, моделирующей работу кассы приема платежей

Страницы работы

Содержание работы

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра ССОД

Расчетно-графическая работа

по дисциплине «Операционные системы»

Вариант №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);

Похожие материалы

Информация о работе