НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра ССОД
Расчетно-графическая работа
по дисциплине «Операционные системы»
Вариант №18
Факультет: АВТ Преподаватель
Группа: АИ-72 Родников В.В.
Студент: Спитченко В.М.
Отметка о защите:
________________
Дата защиты: «____»___________2009г.
Новосибирск
2009
Содержание
стр.
Введение………………………………………..………………………..……………………………. 2
Общая схема работы программы……………………..…………………………………. 2
Описание основных функций…………………………………………… 3
Листинги ………………………………………………………………………………………………. 7
Список литературы ……………………………………………………………………………… 17
Задание:
В девятиэтажном жилом доме четыре подъезда, в каждом работает лифт. После пуска кабина лифта перемещается с этажа на этаж за 4 секунды. Написать программу визуального отображения состояния кабины каждого лифта (стоит или движется), если управление каждым лифтом производится оператором в отдельном дочернем процессе. В окне дочернего
процесса необходимо предусмотреть числовые поля как для номера этажа, на котором остановилась кабина, так и для номера этажа, куда она должна переместиться после нажатия кнопки «ПУСК». Способ кодирования и передачи данных родительскому процессу, а также способ синхронизации выбрать самостоятельно.
Введение:
В качестве способа синхронизации была выбрана передача данных через отображаемую память.
Принцип работы программы заключается в следующем:
Программа контроля создает регион отображаемой памяти, затем запускает программы-лифты (они получают при старте свой порядковый номер).
Управляемая программа-лифт открывает регион созданный управляющей программой (в память отображается массив из 4-х переменных – номер этажа для каждого лифта).
Управляющая программа считывает по таймеру данные из данного массива и выводит их на экран.
Дочерние процессы при перемещении записывают номер текущего этажа в данный массив. (Номер переменной они определяют из номера программы (т.е. 2-ый лифт будет записывать номер этажа во 2-ю переменную из этого массива)).
Общая схема работы программы:
Описание основных функций:
Способ передачи параметров через отображаемую память является самым быстрым из всех способов передачи параметров между процессами (остальные способы основываются на данном методе)
Листинг события OnCreate программы управления, где создается регион отображаемой памяти:
int len = sizeof(HOUSE);
// Выделяем регион памяти для сообщений от лифтов
hFileMapMassiv = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,
PAGE_READWRITE,
0,
len,
"HOUSE");
if(!hFileMapMassiv)
{
ShowMessage("Не могу создать отображение для очереди сообщений");
}
else
{
//Запускаем лифты (4 штуки)
for(int i = 0; i != LIFT_COUNT; i++ )
{
ShellExecute(MainForm->Handle, "open", "Lift.exe", IntToStr(i).c_str(), NULL, SW_RESTORE);
}
}
// Отображаем в адресное пространство процесса (с явным преобразованием типа)
pMessToContr = (int*)MapViewOfFile(hFileMapMassiv,FILE_MAP_ALL_ACCESS,
0,0,len);
if(pMessToContr == NULL)
{
ShowMessage("Не могу отобразить а адресное пространство процесса");
CloseHandle(hFileMapMassiv);
}
Листинг события OnCreate программы-лифта:
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
Image5->Width = MainForm->Width;
Image5->Height = MainForm->Height;
// Определяем номер лифта (копии программы)
if(_argc > 1)
{
PROGNUM = StrToInt(_argv[1]);
AnsiString buf = MainForm->Caption;
buf += " ";
buf += PROGNUM+1;
MainForm->Caption = buf;
}
else PROGNUM = 1;
int len = sizeof(HOUSE);
// Открываем регион памяти для очереди сообщений основной программе
hFileMapMassiv = OpenFileMapping(FILE_MAP_ALL_ACCESS,
false,
"HOUSE");
if(!hFileMapMassiv)
{
ShowMessage("Не могу открыть отображение для очереди сообщений");
return;
}
// Отображаем в адресное пространство процесса (с явным преобразованием типа)
pMessToContr = (int*)MapViewOfFile(hFileMapMassiv,FILE_MAP_ALL_ACCESS,
0,0,len);
if(pMessToContr == NULL)
{
ShowMessage("Не могу отобразить а адресное пространство процесса");
CloseHandle(hFileMapMassiv);
return;
}
}
Рис.1. Главная форма программы-лифта.
На данной форме осуществляется управление моделью «лифта» из девятиэтажного здания:
После выбора этажа нажимаем «Пуск» и «лифт» перемещается на выбранный этаж, при этом номер текущего этажа отображается на индикаторе.
За перемещение лифта отвечают 2 функции:
- Функция перемещения, рассчитывает расстояние «в этажах» которое необходимо проехать лифту
//---------------------------------------------------------------------------
void Moving(int CurrStage, int SelectStage)
{
s = CurrStage - SelectStage; //Расстояние (в этажах) на которое нужно переместится
if( s < 0) //Едем вверх
{
where = true;
}
else //Едем вниз
{
where = false;
}
s = abs(s);
MainForm->MoveTimer->Enabled = true; //Запускаем таймер перемещения
//Один этаж лифт проезжает за 0,5 секунды
}
- Событие «MoveTimer» - срабатывает с интервалом 500 мсек, здесь «перемещаем лифт» запускаем анимацию перемещения и сообщаем программе контроля о перемещении.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.