Министерство образования и науки РФ
Новосибирский Государственный Технический Университет
Кафедра ССОД
Расчетно-графическая работа
по дисциплине «Операционные системы»
Вариант №18
Факультет: АВТ Преподаватель
Группа: АТ - 93 Родников В.В.
Студент: Кириллова М.А.
Отметка о защите:
________________
Дата защиты: «____»___________2011г.
Новосибирск
2011
Содержание:
1. Задание _ _ _ _ _ _ _ _ _ _ _2
2. Введение _ _ _ _ _ _ _ _ _ _ _2
3. Общая схема работы программы _ _ _ _ _ _ _3
4. Краткое описание переменных _ _ _ _ _ _ _3
5. Описание основных функций _ _ _ _ _ _ _4
6. Вид окна приложения _ _ _ _ _ _ _ _6
7. Листинг Unit1.h _ _ _ _ _ _ _ _ _6
8. Листинг Unit1.cpp _ _ _ _ _ _ _ _ _8
9. Заключение _ _ _ _ _ _ _ _ _ _14
10. Список литературы _ _ _ _ _ _ _ _ _14
Задание:
В девятиэтажном жилом доме четыре подъезда, в каждом работает лифт. После пуска кабина лифта перемещается с этажа на этаж за 4 секунды. Написать программу визуального отображения состояния кабины каждого лифта (стоит или движется), если управление каждым лифтом производится оператором в отдельном дочернем процессе. В окне дочернего процесса необходимо предусмотреть числовые поля как для номера этажа, на котором остановилась кабина, так и для номера этажа, куда она должна переместиться после нажатия кнопки «ПУСК». Способ кодирования и передачи данных родительскому процессу, а также способ синхронизации выбрать самостоятельно.
Введение:
Процесс будет разделён на два потока, осуществляющие работу с разделяемым ресурсом. Критическая секция – часть программы, в которой осуществляется доступ к разделяемым данным. Используя для синхронизации работы критическую секцию, обеспечим в каждый момент в критической секции, связанной с этим ресурсом, нахождение максимум одного процесса (приём взаимного исключения).
Пользователь выбирает нужные подъезд и лифт, далее для каждого лифта всё идет по одинаковым сценариям:
- пользователь устанавливает номер этажа, куда должна переместиться кабина;
- числовое значение пункта назначения (1-9) присваивается переменной dest_st (destination_station)
- Щелчок по кнопке «Поехали! ». Начинает работу таймер.
- Главный поток считывает значение dest_st
- Главный поток сравнивает значения переменных dest_st и floor
- - если dest_st > floor, то floor + +
- - если dest_st < floor, то floor - -
- главный поток освобождает ресурс
- вторичный поток считывает floor
- вторичный поток выводит текущее значение floor на форму
- вторичный поток освобождает ресурс
- - если dest_st ! = floor, то снова начинают сравниваться значения переменных, либо, если пользователь ввёл новые данные, начинается их обработка.
Общая схема работы программы:
Краткое описание переменных:
int floor1; //Переменные, хранящие "положение" кабины (этаж)
int floor2;
int floor3;
int floor4;
int dest_st1; // Пункт назначения (номер этажа)
int dest_st2;
int dest_st3;
int dest_st4;
Описание основных функций:
1) Функция вторичного потока. Представляет собой бесконечный цикл. За счёт использования критической секции вторичный поток получает доступ к разделяемому ресурсу только после того, как главный поток завершил операции, связанные с этим ресурсом.
//---------------------------------------------------------------------------
DWORD WINAPI ThreadFunc1(void *p) //функция вторичного потока
{
while(1)
{
EnterCriticalSection(§);
Form1->Label1->Caption = floor1; //отображаем текущее положение лифтов
Form1->Label2->Caption = floor2;
Form1->Label3->Caption = floor3;
Form1->Label4->Caption = floor4;
LeaveCriticalSection(§);
}
}
//---------------------------------------------------------------------------
2) Кнопка «Поехали!» для первого лифта (аналогично для всех лифтов).
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer5->Enabled=true; // включаем таймер
Form1->Panel11->Color = clBtnFace; // закрываем двери
}
//---------------------------------------------------------------------------
3) Функция таймера для первого лифта (аналогично для всех лифтов).
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer5Timer(TObject *Sender)
{
EnterCriticalSection(§); // входим в критическую секцию
{
if (floor1= =Edit1->Text.ToInt()) // если приехали
{
Form1->Panel11->Color=clYellow; // открываем двери
}
if (floor1<Edit1->Text.ToInt()) //если находимся ниже, чем нужно
{
Form1->Panel11->Color = clBtnFace; // закрываем двери (это на случай,
//если пользователь меняет пункт назначения
//«по пути»
Panel11->Top -= 5; //едем вверх
if(Panel11->Top >= perv-prolet*9) //лифт на 9 этаже
floor1 = 9;
if(Panel11->Top >= perv-prolet*8) //лифт на 8 этаже
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.