Реализация периодического вывода баннер-сообщения на экран основной формы

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

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

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

Кафедра ССОД

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

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

Вариант №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);

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

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