Проецируемая память
Помогите, пожалуйста, доделать код, чтобы из цикла данные записывались в "проецируемую" (в одном процессе), а в другом процессе эта память считывалась и выводилась на экран. На 147 строке ошибка с внесением данных, а со 159 не знаю, как реализовать вывод.
Код:
#include <windows.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <clocale>
#include <process.h>
#include <fstream>
using namespace std;
// Глобальные переменные.
int N = 20;
int A = 2;
int B = 10;
int startN = 0; // промежуток [0;endFiestN]
int endFirstN = int(N/3); // промежуток [endFiestN;endSecondN]
int endSecondN = 2*endFirstN; // промежуток [endFiestN;endN]
int endN = N;
float fi = 0;
float fiMax = 2 * 3.14;
float fiAdd = fiMax / N;
int k = 0; //флажок
HANDLE hMapFile;
float Buffer[20][3]; // "буфер"
int iB = 0; // счетчик буфера.
HANDLE hSemaphore; // Семафор для учета элементов очереди
HANDLE hWriteEvent; // Событие
void threadPrint(float fi, float x, float y){
printf("fi = %2.1f: x = %2.1f \t\t y = %2.1f\n", fi, x, y);
}
void threadResult(int sN, int lN){
float x, y;
for (int i = sN; i < lN; i++){
x = (B - A)*cos(fi) + A*cos((B - A)*(fi / A));
y = (B - A)*sin(fi) + A*sin((B - A)*(fi / A));
//Запись результата в буфер.
Buffer[iB][0] = fi;
Buffer[iB][1] = x;
Buffer[iB][2] = y;
fi = fi + fiAdd;
iB++;
}
}
unsigned __stdcall ThreadFunc1(LPVOID lpParam)
{
WaitForSingleObject(hSemaphore,INFINITE);
int start;
int lastN = 1;
if(k == 0){
start = startN;
lastN = endFirstN;
threadResult(start, lastN);
k = 1;
} else if (k == 1){
start = endFirstN;
lastN = endSecondN;
threadResult(start, lastN);
k = 2;
} else {
start = endSecondN;
lastN = endN;
threadResult(start, lastN);
}
k++;
ReleaseSemaphore(hSemaphore,1, NULL); // Увеличиваем счетчик семафора на 1.
}
unsigned __stdcall ThreadFunc2(LPVOID lpParam)
{
WaitForSingleObject(hSemaphore,INFINITE);
int start;
int lastN = 1;
if(k == 0){
start = startN;
lastN = endFirstN;
threadResult(start, lastN);
k = 1;
} else if (k == 1){
start = endFirstN;
lastN = endSecondN;
threadResult(start, lastN);
k = 2;
} else {
start = endSecondN;
lastN = endN;
threadResult(start, lastN);
}
ReleaseSemaphore(hSemaphore,1, NULL); // Увеличиваем счетчик семафора на 1.
}
unsigned __stdcall ThreadFunc3(LPVOID lpParam)
{
WaitForSingleObject(hSemaphore,INFINITE);
int start;
int lastN = 1;
if(k == 0){
start = startN;
lastN = endFirstN;
threadResult(start, lastN);
k = 1;
} else if (k == 1){
start = endFirstN;
lastN = endSecondN;
threadResult(start, lastN);
k = 2;
} else {
start = endSecondN;
lastN = endN;
threadResult(start, lastN);
}
k++;
ReleaseSemaphore(hSemaphore,1, NULL); // Увеличиваем счетчик семафора на 1.
}
unsigned __stdcall ThreadPrint(LPVOID lpParam)
{
WaitForSingleObject (hWriteEvent, INFINITE);
int i = 0;
while (i < N){
float a = Buffer[i][0], b = Buffer[i][1], c = Buffer[i][2];
threadPrint(a,b,c);
i++;
}
}
unsigned __stdcall ThreadWrite(LPVOID lpParam)
{
WaitForSingleObject (hWriteEvent, INFINITE);
ofstream outfile;
outfile.open("Out.txt");
for(int i = 0; i < N; i++){
outfile<<Buffer[i][0]<<"\t"<<Buffer[i][1]<<"\t\t"<<Buffer[i][2]<<endl;
outfile.clear();
}
}
unsigned __stdcall ThreadReadAndWriteToObj(LPVOID lpParam)
{
PFLOAT pBuf;
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 256, "MyFileMappingObject"); //Создание объекта "проекция файла".
pBuf = (PFLOAT) MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,256); //создание представления файла в адресном пространстве процесса.
////// Здесь ошибка!
for(int i = 0; i < N; i++){
float a = Buffer[i][0], b = Buffer[i][1], c = Buffer[i][2];
CopyMemory((PFLOAT)pBuf, a, 10000);
}
UnmapViewOfFile(pBuf);
}
unsigned __stdcall ThreadReadAndPrint(LPVOID lpParam)
{
printf("Из проецируемой памяти:");
////// Здесь добавить!
LPCTSTR pBuf;
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,"MyFileMappingObject");
pBuf = (LPTSTR) MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,256);
MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
UnmapViewOfFile(pBuf);
}
main()
{
setlocale(LC_CTYPE, "russian");
STARTUPINFO cif1, cif2;
ZeroMemory(&cif1,sizeof(STARTUPINFO));
PROCESS_INFORMATION pi1, pi2;
if(!CreateProcess(NULL, "MyChildProcess",NULL,NULL,FALSE,0,NULL,NULL,&cif1,&pi1)) //Процесс #1
{
hSemaphore=CreateSemaphore(NULL, 1, 1000, NULL); //Создаем семафор.
LPCTSTR pBuf;
unsigned uThreadIDs[6];
HANDLE hThreads[6], hMapFile1, hMapFile2;
hThreads[0] = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc1, NULL, 0,&uThreadIDs[0]);
hThreads[1] = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc2, NULL, 0,&uThreadIDs[1]);
hThreads[2] = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc3, NULL, 0,&uThreadIDs[2]);
hThreads[3] = (HANDLE)_beginthreadex( NULL, 0, &ThreadPrint, NULL, 0,&uThreadIDs[3]);
hThreads[4] = (HANDLE)_beginthreadex( NULL, 0, &ThreadWrite, NULL, 0,&uThreadIDs[4]);
hThreads[5] = (HANDLE)_beginthreadex( NULL, 0, &ThreadReadAndWriteToObj, NULL, 0,&uThreadIDs[5]);
WaitForMultipleObjects(3, hThreads, TRUE, INFINITE );
CloseHandle( hSemaphore );
CloseHandle( hThreads[0] );
CloseHandle( hThreads[1] );
CloseHandle( hThreads[2] );
hWriteEvent = CreateEvent(NULL,TRUE,FALSE,TEXT("WriteEvent"));
CloseHandle( hThreads[3] );
CloseHandle( hThreads[4] );
CloseHandle( hThreads[5] );
}
CloseHandle( pi1.hProcess);
if(!CreateProcess(NULL, "MyChildProcess",NULL,NULL,FALSE,0,NULL,NULL,&cif2,&pi2)) //Процесс #2
{
unsigned uThreadIDs[1];
HANDLE hThreads[1];
hThreads[0] = (HANDLE)_beginthreadex( NULL, 0, &ThreadReadAndPrint, NULL, 0,&uThreadIDs[0]);
WaitForMultipleObjects(1, hThreads, TRUE, INFINITE );
CloseHandle( hThreads[0] );
}
}
Источник: Stack Overflow на русском