Взаимодействие между приложениям. Разработка несколько приложений, осуществляющих совместное решение поставленной задачи, страница 2

char element[40];

int k=0,i=0,j=0,l=1,u=1;

while((i*i)<(razm[nn])*(razm[nn]))//Пока не прошли все элементы

{

if(buf[l]!=' ')

{while(buf[l]!=' ')

{element[k]=buf[l];

k++;

l++;

}

element[k]='\0';//Обрезаем строку

if(nn==0) a[i][j]=atoi(element);

else b[i][j]=atoi(element);

ZeroMemory(element,sizeof(element));

k=0;

j++;

if(j==razm[nn])//Если просмотрена вся строка

{i++;//переходим к следующей

j=0;

}                                                                                                                

}

l++;

}

GetOverlappedResult(file,&ov,&dw,TRUE);

}

CloseHandle(file);

}

}

DWORD WINAPI MultiplyMatrix(void* p)

{//создаём матрицу С

if(razm[0]==razm[1])

{

int s;

c=new int* [razm[0]];

for(int i=0;i<razm[0];i++)

c[i]=new int[razm[0]];

for(int i=0;i<razm[0];i++)

for(int j=0;j<razm[0];j++)

{

s=0;

for(int k=0;k<razm[0];k++)

s=s+a[i][k]*b[k][j];

c[i][j]=s;             

}

}

else MessageBox(NULL,"Размерности квадратных матриц неодинаковы!",0,MB_OK);

}

Sec.cpp

using namespace std;

static int **c,n=4;

static float det;//Определитель матрицы С

HANDLE hThread1,hThread2;

DWORD WINAPI Determinant(void *p);

DWORD WINAPI Write(void* p);

int main(int argc, char *argv[])

{setlocale(LC_CTYPE,"Russian");

HANDLE hMapping;

void* pMapping;

//Создаём матрицу C

c=new int* [n];             

for(int i=0;i<n;i++)

c[i]=new int[n];

//Открываем проекцию  

hMapping = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE, "Матрица_С");

if(hMapping!=NULL)

{

pMapping = MapViewOfFile( hMapping, FILE_MAP_READ, 0,0, 0 );

//считываем данные из памяти

int *p;

p=(int*)pMapping;

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

{

c[i][j]=*p;

p++;

}

}

printf("\second.exe получил матрицу С:\n");

for(int i=0;i<n;i++)

{printf("\n");

for(int j=0;j<n;j++)

printf(" %d",c[i][j]);

}

hThread1=CreateThread(NULL,0,Determinant,0,0,NULL);

hThread2=CreateThread(NULL,0,Write,0,0,NULL);

WaitForSingleObject(hThread2,INFINITE);

printf("\nsecond.exe->Определитель матрицы С равен %f \n",det);

printf("second.exe->Данные записаны в файл\n");  

}

else

printf("\nОшибка при открытии проекции файла\n"); 

UnmapViewOfFile(pMapping);

CloseHandle(hThread1);

CloseHandle(hThread2);

CloseHandle(hMapping);

return EXIT_SUCCESS;

}

DWORD WINAPI Determinant(void *p)

{          float l;

int k;

float cc[n][n];

for(int i=0;i<n;i++)

for(int j=0;j<n;j++)

cc[i][j]=c[i][j];

//Метод Гаусса

k=0;

while(k<n-1)

{for (int i=k+1;i<n;i++)//смотрим строку

{l=float(cc[i][k]) / cc[k][k];//вычисляем коэфициент

for (int j=k; j<n;j++) //смотрим столбец

//отнимаем строчку умноженую на коэфициент

cc[i][j]=cc[i][j]-(cc[k][j]*l);

}

k=k+1;//k-показывает из какого столбца начинать вычитать

}

float mul=1;       

for(int i=0;i<n;i++)

mul*=cc[i][i];

det=mul;             

}

DWORD WINAPI Write(void* p)

{WaitForSingleObject(hThread1,INFINITE);//Ждём посчёта определителя

char buf1[500],buf2[500];//Буффер для записи в файл

HANDLE file1;//Идентификатор файла

DWORD dw1; //Количство прочитаных байт

OVERLAPPED ov1;//Структура OVERLAPPED

ZeroMemory(&buf1,sizeof(buf1));

int ii=0;

int kk=0;

char symb[100];

for(int i=0;i<n;i++)

{for(int j=0;j<n;j++)

{ZeroMemory(symb,sizeof(symb));

sprintf(symb," %d ",c[i][j]);//получаем строку из числа

kk=0;

while(kk<strlen(symb))//посимвольно копируем полученую строку в буфер

{           

buf1[ii]=symb[kk];

ii++;

kk++;

}

}

buf1[ii]='\r';

ii++;

buf1[ii]='\n';

ii++;

}

buf1[ii]='\r';

ii++; buf1[ii]='\n';

ii++;

ZeroMemory(symb,sizeof(symb));

kk=0;

sprintf(symb,"Определитель: %f",det);

while(kk<strlen(symb))

{          

buf1[ii]=symb[kk];

ii++;

kk++;

}

//Записываем полученные результаты в файл

ZeroMemory(&ov1,sizeof(OVERLAPPED));

ov1.Offset=0;

ov1.hEvent=CreateEvent(NULL,TRUE,FALSE,0);

file1=CreateFile("rez.txt",FILE_WRITE_DATA,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_FLAG_OVERLAPPED,NULL);

if(WriteFile(file1,buf1,sizeof(buf1),&dw1,&ov1)|| GetLastError()==ERROR_IO_PENDING)

{

GetOverlappedResult(file1,&ov1,&dw1,TRUE);

}

}

Результаты  работы:

Файл1                   Файл2

4                             4

1 3 5 6                    5 3 5 6

9 8 10 5                  9 3 10 5

3 1 13 2                  1 11 19 2

-3 9 -10 5               -3 9 -20 15

Результирующий файл

19  121  10  121

112  206  215  189

31  173  232  79

41  -47  -215  82

Определитель: 18055420.000000 

Вывод: было разработано несколько приложений, осуществляющих совместное решение поставленной задачи. Изучена  технология  создания проекций файлов и использования их в разных приложениях.