НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра ССОД
Расчетно-графическая работа
по дисциплине «Операционные системы»
Вариант №18
Факультет: АВТ Преподаватель
Группа: АО-81 Родников В.В.
Студент: Старцева М.
Отметка о защите:
________________
Дата защиты: «____»___________2010г.
Новосибирск
2010
Содержание
стр.
Введение………………………………………..………………………..……………………………. 2
Общая схема работы программы……………………..…………………………………. 2
Описание основных функций…………………………………………… 3
Листинги ………………………………………………………………………………………………. 6
Список литературы ……………………………………………………………………………… 16
Задание:
В девятиэтажном жилом доме четыре подъезда, в каждом работает лифт.
После пуска кабина лифта перемещается с этажа на этаж за 4 секунды.
Написать программу визуального отображения состояния кабины
каждого лифта (стоит или движется), если управление каждым лифтом
производится оператором в отдельном дочернем процессе. В окне дочернего
процесса необходимо предусмотреть числовые поля как для номера этажа, на
котором остановилась кабина, так и для номера этажа, куда она должна
переместиться после нажатия кнопки «ПУСК». Способ кодирования и
передачи данных родительскому процессу, а также способ синхронизации
выбрать самостоятельно.
Введение:
В качестве способа синхронизации была выбрана синхронизация через критическую секцию.
Принцип работы программы заключается в следующем:
Пользователь выбирает лифт в нужном подъезде и нажимает кнопку «Пуск» лифт перемещается и меняется состояний переменной stage (stage1 для первого лифта), состояние этой переменной (для всех лифтов) выводится на форму вторичным потоком. Перменные stage1, stage2, stage3 и stage4 являются разделяемым ресурсом между потоками программы.
Общая схема работы программы:
Описание основных функций:
Приведем листинги функций:
Функция вторичного потока представляет собой бесконечный цикл :
//---------------------------------------------------------------------------
DWORD WINAPI ThreadFunc1(void *p) //функция вторичного потока
{
while(1)
{
EnterCriticalSection(§);
Form1->Label1->Caption = stage1; //отображаем текущее положение лифтов
Form1->Label2->Caption = stage2;
Form1->Label3->Caption = stage3;
Form1->Label4->Caption = stage4;
LeaveCriticalSection(§);
}
}
Функция таймера перемещения для первого лифта :
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
EnterCriticalSection(§); //входим в критическую секцию
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(§);
}
Функция таймера закрывания дверей для первого лифта : («закрывание и открывание» дверей лифта – перемещение и изменение ширины панелей находящихся на панели символизирующей лифт (жёлтая))
//---------------------------------------------------------------------------
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>
//---------------------------------------------------------------------------
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.