НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра ССОД
Расчетно-графическая работа
по дисциплине «Операционные системы»
Вариант №6
Факультет: АВТ Преподаватель
Группа: АТ-83 Родников В.В.
Студент: Грунтова Л.
Отметка о защите:
________________
Дата защиты: «____»___________2010г.
Новосибирск
2010
Содержание
стр.
Введение………………………………………..………………………..……………………………. 2
Общая схема работы программы……………………..…………………………………. 2
Листинги ………………………………………………………………………………………………. 7
Список литературы ……………………………………………………………………………… 15
Задание:
Реализовать периодический вывод баннер-сообщения на экран основной
формы. Тексты сообщений предварительно заносятся в текстовый файл,
который читается дочерним процессом. Выбор сообщения - по случайному
закону, передача его текста родительскому процессу - через отображаемую
память. Место вывода и вид сообщения - по выбору разработчика.
Синхронизация доступа к памяти - мьютексы или события.
Введение:
В качестве способа синхронизации была выбрана синхронизация при помощи мьютекса.
Дочерний процесс считывает тексты сообщений из файла, затем передает эти данные при помощи отображаемой памяти родительскому процессу, который и выводит тексты сообщений на свою форму. Разделяемым ресурсом является область отображаемой памяти, синхронизация осуществляется при помощи мьютекса. Мьютекс и область отображаемой памяти создает родительский процесс.
Общая схема работы программы:
Описание основных функций:
Рис 1. Форма главной программы
Рис 2. Форма дочернего процесса
Листинги:
Листинг заголовочного файла главной программы:
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TTimer *Timer1;
TTimer *MoveTimer;
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall MoveTimerTimer(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Листинг файла Unit1.cpp главной программы:
//---------------------------------------------------------------------------
//главная программа - выводим сообщения на форму
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#define MESS_COUNT 4 //Количество сообщений
struct sMESS
{
char str[256];
} ;
HANDLE hFileMap = NULL;
HANDLE hFileMapMassiv = NULL;
HANDLE hMutex = NULL; //дескриптор мьютекса
sMESS MASS[MESS_COUNT]; //Массив из 4-х строк AnsiString
sMESS* pMessToContr; //Сообщение (массив) для программы контроля
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
hMutex=OpenMutex(MUTEX_ALL_ACCESS, true, "MyMutex");
if(WaitForSingleObject(hMutex, 500) == WAIT_OBJECT_0)
{
//считываем сообщения от дочернего процесса
if(hFileMapMassiv)
{
Label1->Caption = pMessToContr[0].str;
Label2->Caption = pMessToContr[1].str;
Label3->Caption = pMessToContr[2].str;
Label4->Caption = pMessToContr[3].str;
}
ReleaseMutex(hMutex);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//открываем мьютекс
hMutex = CreateMutex(NULL, false, "MyMutex"); //создаем мьютекс
int len = sizeof(MASS);
// Выделяем регион памяти для сообщений от дочернего процесса
hFileMapMassiv = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,
PAGE_READWRITE,
0,
len,
"MASS");
if(!hFileMapMassiv)
{
ShowMessage("Не могу создать отображение для очереди сообщений!");
}
else
{
//Запускаем дочерний процесс
ShellExecute(Form1->Handle, "open", "MessManage.exe", NULL, NULL, SW_RESTORE);
}
//Отображаем в адресное пространство процесса (с явным преобразованием типа)
pMessToContr = (sMESS*)MapViewOfFile(hFileMapMassiv,FILE_MAP_ALL_ACCESS,
0,0,len);
if(pMessToContr == NULL)
{
ShowMessage("Не могу отобразить в адресное пространство процесса");
CloseHandle(hFileMapMassiv);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(hFileMapMassiv) CloseHandle(hFileMapMassiv);
if(pMessToContr) UnmapViewOfFile(pMessToContr);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MoveTimerTimer(TObject *Sender)
{
//перемещаем сообщения по экрану
Label1->Left += 5; //первое направо
if (Label1->Left >= Form1->Width)
Label1->Left = 0;
Label2->Left -= 5; //второе налево
if (Label2->Left <= -Label2->Width)
Label2->Left = Form1->Width;
Label3->Left += 5; //3-е направо
if (Label3->Left >= Form1->Width)
Label3->Left = 0;
Label4->Left -= 5; //4-е налево
if (Label4->Left <= -Label4->Width)
Label4->Left = Form1->Width;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
Листинг заголовочного файла дочерней программы:
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <inifiles.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TEdit *Edit1;
TEdit *Edit2;
TEdit *Edit3;
TEdit *Edit4;
TButton *Button2;
TButton *Button3;
TTimer *Timer1;
TTimer *ChangeTimer;
void __fastcall Button1Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.