МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ
ГОМЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ИМЕНИ П. О. СУХОГО
Факультет автоматизированных и информационных систем
Кафедра «Информационные технологии»
ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ № 7
по дисциплине «Мультипрограммная и мультипроцессорная обработка
данных»
на тему: «Взаимодействие между приложениями»
Выполнила: студент гр. ИТ-32
Принял: преподаватель
А
Дата сдачи отчета: _____________________
Дата допуска к защите: _____________________
Дата защиты: _____________________
Гомель 2013
ЛАБОРАТОРНАЯ РАБОТА №7
Взаимодействие между приложениями
Цель работы: разработать несколько приложений, осуществляющих совместное решение поставленной задачи.
Задания:
Необходимо разработать два приложения, решающие одну задачу согласно варианта. Чётные варианты для обмена данными между процессами используют проецирование файлов.
Листинг программы:
Main.cpp
using namespace std;
static int **a,**b,**c;
static int razm[2];//Размерности квадратных матриц
HANDLE hThread1,hThread2,hThread3;
DWORD WINAPI ObrabBuffer(void *param);
DWORD WINAPI MultiplyMatrix(void* p);
typedef struct dannie
{har *file;//имя файла
int n;//номер матрицы
}Dannie,*dan;
int main(int argc, char *argv[])
{setlocale(LC_CTYPE,"Russian");
Dannie dan1;
dan1.file="1.txt";
dan1.n=0;
hThread1=CreateThread(NULL,0,ObrabBuffer,&dan1,0,NULL);
Dannie dan2;
dan2.file="2.txt";
dan2.n=1;
hThread2=CreateThread(NULL,0,ObrabBuffer,&dan2,0,NULL);
WaitForSingleObject(hThread1,INFINITE);
WaitForSingleObject(hThread2,INFINITE);
printf("Файлы считаны успешно.\n\n");
for(int i=0;i<razm[0];i++)
{
printf("\n");
for(int j=0;j<razm[0];j++)
printf(" %d",a[i][j]);
}
printf("\n");
for(int i=0;i<razm[0];i++)
{printf("\n");
for(int j=0;j<razm[0];j++)
printf(" %d",b[i][j]);
}
printf("\nВычисление произведения матриц\n");
hThread3=CreateThread(NULL,0,MultiplyMatrix,NULL,0,NULL);
WaitForSingleObject(hThread3,INFINITE);
printf("\nПроизведения матриц=\n");
for(int i=0;i<razm[0];i++)
{for(int j=0;j<razm[0];j++)
printf(" %d",c[i][j]);
printf("\n");
}
void *pMapping;//указатель на память
HANDLE hMapping=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,sizeof(c),"Матрица_С");//создаём проекция
if(hMapping!=NULL)
{ pMapping=MapViewOfFile(hMapping,FILE_MAP_WRITE,0,0,0);
//заполняем память данными for (p=(int*)pMapping,i=0; i<256; i++) *p++=i;
int *p;
p=(int*)pMapping;
for(int i=0;i<razm[0];i++)
for(int j=0;j<razm[0];j++)
{
*p=c[i][j];
*p++; //Увеличиваем именно адрес (звёздочка) а не значение
}
//Создаём и заполняем структуры
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si,0,sizeof(si));
memset(&pi,0,sizeof(pi));
si.cb=sizeof(si);
CreateProcess("sec.exe",0,0,0,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
printf("\nЗапущенно 2-ое приложение\n");
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
printf("Второе приложение завершилось\n");
}
else
printf("\nОшибка при создании проекции файла\n");
system("PAUSE");
UnmapViewOfFile( hMapping );
CloseHandle( hMapping );
CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hThread3);
return EXIT_SUCCESS;
}
DWORD WINAPI ObrabBuffer(void *param)//чтение из файлов
{ dan d=(dan)param;
char *fn=d->file;
int nn=d->n;
HANDLE file;//Идентификатор файла
DWORD dw; //Количство прочитаных байт
OVERLAPPED ov;//Структура OVERLAPPED
char buf[500];//Буффер для чтения из файлов
//Описываем файлы
file=CreateFile(fn,FILE_READ_DATA,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_FLAG_OVERLAPPED,NULL);
if(file==INVALID_HANDLE_VALUE)
{MessageBox(NULL,"Ошибка чтения файла!",0,MB_OK);}
else
{//Описываем структуру OVERLAPPED
ZeroMemory(&ov,sizeof(OVERLAPPED));
ov.Offset=0;
ov.hEvent=CreateEvent(NULL,TRUE,FALSE,0);
//Очищаем буфер для чтения из файла
ZeroMemory(&buf,sizeof(buf));
if(ReadFile(file,buf,sizeof(buf),&dw,&ov)|| GetLastError()==ERROR_IO_PENDING)
{//Обрабатываем данные прочитанные из файла
razm[nn]=atoi(&buf[0]);//Читаем размерность матрицы
//Создаём матрицу
if(nn==0)
{a=new int* [razm[nn]];
for(int i=0;i<razm[nn];i++)
a[i]=new int[razm[nn]];
}
else
{ b=new int* [razm[nn]];
for(int i=0;i<razm[nn];i++)
b[i]=new int[razm[nn]];
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.