void __fastcall Button3Click(TObject *Sender);
void __fastcall SaveParam(); //Сохранение параметров в ini файл
void __fastcall LoadParam();
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall ChangeTimerTimer(TObject *Sender); //Чтение параметров из ini файла
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"
struct sMESS //структура сообщения
{
char str[256]; //текст сообщения
} ;
#define MESS_COUNT 4 //Количество сообщений
HANDLE hFileMap = NULL; //дескрипторы
HANDLE hFileMapMassiv = NULL;
sMESS MASS[MESS_COUNT]; //Массив из 4-х строк AnsiString
sMESS* pMessToContr; //Сообщение (массив) для главной программы
HANDLE hMutex = NULL;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
LoadParam(); //считываем тексты из файла при старте программы
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
int len = sizeof(MASS);
// Открываем регион памяти для очереди сообщений основной программе
hFileMapMassiv = OpenFileMapping(FILE_MAP_ALL_ACCESS,
false,
"MASS");
if(!hFileMapMassiv)
{
ShowMessage("Не могу открыть отображение для очереди сообщений");
return;
}
// Отображаем в адресное пространство процесса (с явным преобразованием типа)
pMessToContr = (sMESS*)MapViewOfFile(hFileMapMassiv,FILE_MAP_ALL_ACCESS,
0,0,len);
if(pMessToContr == NULL)
{
ShowMessage("Не могу отобразить а адресное пространство процесса");
CloseHandle(hFileMapMassiv);
return;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
hMutex=OpenMutex(MUTEX_ALL_ACCESS, true, "MyMutex"); //открываем мьютекс
if(WaitForSingleObject(hMutex, 500) == WAIT_OBJECT_0)
{
//по таймеру передача сообщений
//Сообщаем о перемещении программе контроля
if(hFileMapMassiv)
{
strcpy(pMessToContr[0].str, Edit1->Text.c_str());
strcpy(pMessToContr[1].str, Edit2->Text.c_str());
strcpy(pMessToContr[2].str, Edit3->Text.c_str());
strcpy(pMessToContr[3].str, Edit4->Text.c_str());
}
ReleaseMutex(hMutex);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//загружаем тексты из файла
LoadParam();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
//меняем тексты в файле не те что в Edit
SaveParam();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveParam() //Функция сохранения параметров в ini файл
{
AnsiString ini_name = ChangeFileExt(Application->ExeName, ".ini"); //Открываем ini-файл
TIniFile *mfile = new TIniFile(ini_name);
//записываем тексты сообщений
mfile->WriteString("Message1","TEXT", Edit1->Text);
mfile->WriteString("Message2","TEXT", Edit2->Text);
mfile->WriteString("Message3","TEXT", Edit3->Text);
mfile->WriteString("Message4","TEXT", Edit4->Text);
delete mfile;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LoadParam() //Функция загрузки параметров из ini файла
{
AnsiString ini_name = ChangeFileExt(Application->ExeName, ".ini"); //Открываем ini-файл
TIniFile *mfile = new TIniFile(ini_name);
Edit1->Text = mfile->ReadString("Message1","TEXT", "Привет!");
Edit2->Text = mfile->ReadString("Message2","TEXT", "Hello!");
Edit3->Text = mfile->ReadString("Message3","TEXT", "Guten Tag!");
Edit4->Text = mfile->ReadString("Message3","TEXT", "Здоровенки будете!");
delete mfile;
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(hFileMapMassiv) CloseHandle(hFileMapMassiv); //удаляем область отображаемой памяти
if(pMessToContr) UnmapViewOfFile(pMessToContr);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ChangeTimerTimer(TObject *Sender)
{
//меняем тексты сообщений местами
AnsiString ini_name = ChangeFileExt(Application->ExeName, ".ini"); //Открываем ini-файл
TIniFile *mfile = new TIniFile(ini_name);
int a = random(4); //генерируем случайное число
switch(a)
{
case 0:
{
Edit1->Text = mfile->ReadString("Message4","TEXT", "Привет!");
Edit2->Text = mfile->ReadString("Message3","TEXT", "Hello!");
Edit3->Text = mfile->ReadString("Message2","TEXT", "Guten Tag!");
Edit4->Text = mfile->ReadString("Message1","TEXT", "Здоровеньки будете!");
} break;
case 1:
{
Edit1->Text = mfile->ReadString("Message2","TEXT", "Привет!");
Edit2->Text = mfile->ReadString("Message1","TEXT", "Hello!");
Edit3->Text = mfile->ReadString("Message3","TEXT", "Guten Tag!");
Edit4->Text = mfile->ReadString("Message4","TEXT", "Здоровеньки будете!");
} break;
case 2:
{
Edit1->Text = mfile->ReadString("Message2","TEXT", "Привет!");
Edit2->Text = mfile->ReadString("Message1","TEXT", "Hello!");
Edit3->Text = mfile->ReadString("Message4","TEXT", "Guten Tag!");
Edit4->Text = mfile->ReadString("Message3","TEXT", "Здоровеньки будете!");
} break;
case 3:
{
Edit1->Text = mfile->ReadString("Message1","TEXT", "Привет!");
Edit2->Text = mfile->ReadString("Message4","TEXT", "Hello!");
Edit3->Text = mfile->ReadString("Message2","TEXT", "Guten Tag!");
Edit4->Text = mfile->ReadString("Message3","TEXT", "Здоровеньки будете!");
} break;
};
delete mfile; //закрываем ini файл
}
//---------------------------------------------------------------------------
Список литературы:
1. Программирование в C++ Builder. А.Я. Архангельский, Бином, Москва, 2003.- 1151 с.
2. Конспект лекций по курсу Операционные системы лектор Родников В.В. 2010г.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.