Написание программы визуального отображения состояния кабины каждого лифта в девятиэтажном жилом доме

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

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

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

Кафедра ССОД

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

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

Вариант №18

Факультет: АВТ                                                                                                      Преподаватель

Группа: АО-81                                                                                                         Родников В.В.

Студент: Старцева М.

                                                                 Отметка о защите:

                                                                                                                    ________________

Дата защиты: «____»___________2010г.

Новосибирск

2010

Содержание

стр.

Введение………………………………………..………………………..……………………………. 2

Общая схема работы программы……………………..…………………………………. 2

Описание основных функций……………………………………………  3

Листинги ……………………………………………………………………………………………….  6

Список литературы ………………………………………………………………………………  16

Задание:

 В девятиэтажном жилом доме четыре подъезда, в каждом работает лифт.

 После пуска кабина лифта перемещается с этажа на этаж за 4 секунды.       

       Написать программу визуального отображения состояния кабины

       каждого  лифта (стоит или движется), если управление каждым лифтом

       производится оператором в отдельном дочернем процессе.   В окне дочернего

       процесса необходимо предусмотреть числовые поля как для номера этажа, на

       котором остановилась кабина, так и для номера этажа, куда она должна

       переместиться после нажатия кнопки «ПУСК».   Способ  кодирования и

       передачи данных родительскому процессу, а также способ синхронизации

       выбрать самостоятельно.

Введение:

В качестве способа синхронизации была выбрана синхронизация через критическую секцию.

Принцип работы программы заключается в следующем:

Пользователь выбирает лифт в нужном подъезде и нажимает кнопку «Пуск» лифт перемещается и меняется состояний переменной stage (stage1 для первого лифта), состояние этой переменной (для всех лифтов) выводится на форму вторичным потоком. Перменные stage1, stage2, stage3 и stage4 являются разделяемым ресурсом между потоками программы.

Общая схема работы программы:

 


Описание основных функций:

Приведем листинги функций:

Функция вторичного потока представляет собой бесконечный цикл :

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

DWORD WINAPI ThreadFunc1(void *p) //функция вторичного потока

{

   while(1)

   {

     EnterCriticalSection(&sect);

     Form1->Label1->Caption = stage1; //отображаем текущее положение лифтов

     Form1->Label2->Caption = stage2;

     Form1->Label3->Caption = stage3;

     Form1->Label4->Caption = stage4;

      LeaveCriticalSection(&sect);

   }

}

Функция таймера перемещения для первого лифта :

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

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

  EnterCriticalSection(&sect); //входим в критическую секцию

  if(stage1 == Edit1->Text.ToInt())

  { //приехали

    Timer1->Enabled = false; //останавливаем лифт

    //открываем двери

    open1 = true;

    tick1 = 0;

    Timer5->Enabled = true;

  }

  else

  if(Timer5->Enabled == false) //проверяем закрыты ли двери

  {

          //перемещение лифта

          if(napr1 == 1)

          {

                Panel1->Top -= 5; //едем вверх

                if(Panel1->Top >= nullet-delta*9)      //лифт на 9 этаже

                        stage1 = 9;

                if(Panel1->Top >= nullet-delta*8)       //лифт на 8 этаже

                        stage1 = 8;

                if(Panel1->Top >= nullet-delta*7)       //лифт на 7 этаже

                        stage1 = 7;

                if(Panel1->Top >= nullet-delta*6)      //лифт на 6 этаже

                        stage1 = 6;

                if(Panel1->Top >= nullet-delta*5)      //лифт на 5 этаже

                        stage1 = 5;

                if(Panel1->Top >= nullet-delta*4)      //лифт на 4 этаже

                        stage1 = 4;

                if(Panel1->Top >= nullet-delta*3)      //лифт на 3 этаже

                        stage1 = 3;

                if(Panel1->Top >= nullet-delta*2)      //лифт на 2 этаже

                        stage1 = 2;

                if(Panel1->Top >= nullet-delta)      //лифт на 1 этаже

                        stage1 = 1;

          }

          if(napr1 == -1)

          {

                Panel1->Top += 5; //едем вниз

                if(Panel1->Top >= nullet-delta*8)      //лифт на 9 этаже

                        stage1 = 9;

                if(Panel1->Top >= nullet-delta*7)       //лифт на 8 этаже

                        stage1 = 8;

                if(Panel1->Top >= nullet-delta*6)       //лифт на 7 этаже

                        stage1 = 7;

                if(Panel1->Top >= nullet-delta*5)      //лифт на 6 этаже

                        stage1 = 6;

                if(Panel1->Top >= nullet-delta*4)      //лифт на 5 этаже

                        stage1 = 5;

                if(Panel1->Top >= nullet-delta*3)      //лифт на 4 этаже

                        stage1 = 4;

                if(Panel1->Top >= nullet-delta*2)      //лифт на 3 этаже

                        stage1 = 3;

                if(Panel1->Top >= nullet-delta)      //лифт на 2 этаже

                        stage1 = 2;

                if(Panel1->Top >= nullet)      //лифт на 1 этаже

                        stage1 = 1;

         }

   }

   LeaveCriticalSection(&sect);

}

Функция таймера закрывания дверей для первого лифта : («закрывание и открывание» дверей лифта – перемещение и изменение ширины панелей находящихся на панели символизирующей лифт (жёлтая))

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

void __fastcall TForm1::Timer5Timer(TObject *Sender)

{

   if(!open1)

   {

    if(tick1 >= 4)

    {

        Timer5->Enabled = false;

    }

    Panel6->Width += 5;

    Panel5->Left -= 5;

    Panel5->Width += 5;

    tick1++;

   }

   else

   {

    Panel6->Width -= 5;

    Panel5->Left += 5;

    Panel5->Width -= 5;

    tick1++;

     if(tick1 >= 4)

     {

        open1= false;

        tick1 = 0;

         Panel6->Left = 0;

        Panel6->Width = 9;

        Panel5->Left = 56;

        Panel5->Width = 9;

        napr1 = 0;

        Timer5->Enabled = false;

     }

   }

}

Рис 1. Главная форма программы

Листинги:

Листинг заголовочного файла программы:

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

#ifndef Unit1H

#define Unit1H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ExtCtrls.hpp>

#include <ComCtrls.hpp>

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

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

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