プロセス間通信の古典的な方法;共有メモリ+イベント;


マルチスレッド/マルチプロセス通信については、プログラマーたちが過去に困難だった.MFC技術に詳しいプログラマーは心配していないかもしれません.MFCの技術は十分強いからです.もしあなたがCとAPIで開発していたら.
狂ったことに遭遇することが多い.最近暇なので、この方面のものを復習しました.記録してみんなと一緒に勉強する.本人の能力に限りがあるので、間違いは皆さんに指摘してください.
Aプロセスは一つのことをしたいです.このことをする前提は、Bプロセスが必須条件を提供しなければならないことです.Bプロセスがこの要件を完了すると、Aプロセスに通知し、Aプロセスが開始する.これは典型的な
マルチプロセス/スレッド間の通信インスタンス.次にコードでこれらのことのいきさつを分析します.
まず、読み出し共有メモリのセクションについて説明します.以下はクラス実装です.
ファイルの定義
#pragma once

#define MEMORY_SIZE 1024
#define GLOBAL_MEMORY_NAME TEXT("Global\\ShareMemory")
#define GLOBAL_EVENT_NAME TEXT("Global\\ShareMemoryEvent")

ヘッダファイル
#pragma once

#include <Windows.h>
#include <tchar.h>

class ShareWriteMemory
{
public:
	ShareWriteMemory();
	~ShareWriteMemory();

public:
	bool OnInit();
    bool OnWriteMemory(IN char* pszData);

private:
	HANDLE m_hEvent;
	HANDLE m_hShareHandle;
};

インプリメンテーションファイル
#include "ShareWriteMemory.h"
#include "ShareDefine.h"

ShareWriteMemory::ShareWriteMemory()
{
	m_hEvent = NULL;
	m_hShareHandle = NULL;
}

ShareWriteMemory::~ShareWriteMemory()
{
	if (NULL != m_hShareHandle)
	{
		CloseHandle(m_hShareHandle);
		m_hShareHandle = NULL;
		CloseHandle(m_hEvent);
		m_hEvent = NULL;
	}
}

bool ShareWriteMemory::OnInit()
{
	m_hShareHandle = OpenFileMapping(
		FILE_MAP_WRITE,
		FALSE,
		GLOBAL_MEMORY_NAME);
	if (NULL == m_hShareHandle)
	{
		return false;
	}

	m_hEvent = OpenEvent(EVENT_MODIFY_STATE,TRUE,GLOBAL_EVENT_NAME);
	if (NULL == m_hEvent)
	{
		return false;
	}

	return true;
}

bool ShareWriteMemory::OnWriteMemory(IN char* pszData)
{
	if (NULL == pszData)
	{
		return false;
	}

	char* pBuffer = NULL;

	if (NULL == m_hShareHandle)
	{
		return false;
	}

	pBuffer = (char*)MapViewOfFile(
		m_hShareHandle,
		FILE_MAP_WRITE,
		0,
		0,
		MEMORY_SIZE);
	if (NULL == pBuffer)
	{
		return false;
	}

	__try
	{
		ZeroMemory(pBuffer, strlen(pBuffer));
		CopyMemory((void*)pBuffer, pszData, strlen(pszData));
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		UnmapViewOfFile(pBuffer);
		return false;
	}

    UnmapViewOfFile(pBuffer);
	SetEvent(m_hEvent);

	return true;
}

テストケース実装
#include <windows.h>
#include "ShareWriteMemory.h"
#include <string> 
#include <fstream> 
using namespace std; 

/*
 * date: 02/26/2012 
 * note: I want to write some clean code. but,  I can't today! 
 *       maybe ... sure I can.
 */

int main(int argc, char** argv)
{
	string text;
	char buffer[1024] = {0};
	ShareWriteMemory WriteMemory;

	if (!WriteMemory.OnInit())
	{
		printf("Write Memory is error!
"); return -1; } ifstream file("data", ios::in); while(getline(file,text,'
')) { CopyMemory(buffer, text.c_str(), text.length()); if (!WriteMemory.OnWriteMemory(buffer)) { printf("write memory block is error.
"); break; } Sleep(1000); } return 0; }

メモ:このテスト例は、行ごとにファイルの内容を読み取り、共有メモリに書き込むことを目的として設計されています.
実際には、メモリが書き込まれているため、OnWriteMemoryのパラメータをvoid*タイプに変更することができ、構造体をメモリに書き込むことができます.
具体的な詳細を知りたいなら、もっと深く検討する必要があると思います.コードはここまで書きすぎると説明しません.よく読んでほしいです.私の考えを体得する.
次は、共有メモリを読み込む部分です.
リードメモリヘッダファイル設計
#pragma once

#include <Windows.h>
#include <tchar.h>

class ShareReadMemory
{
public:
	ShareReadMemory();
	~ShareReadMemory();

public:
	bool OnInit();
	bool OnReadMemory(OUT char* pszData);

private:
	HANDLE m_hEvent;
	HANDLE m_hShareHandle;
};

メモリインプリメンテーションファイルの読み取り
#include "ShareReadMemory.h"
#include "ShareDefine.h"

ShareReadMemory::ShareReadMemory()
{
	m_hEvent = NULL;
	m_hShareHandle = NULL;
}

ShareReadMemory::~ShareReadMemory()
{
	if (NULL != m_hShareHandle)
	{
		CloseHandle(m_hShareHandle);
		m_hShareHandle = NULL;

		CloseHandle(m_hEvent);
		m_hEvent = NULL;
	}
}

bool ShareReadMemory::OnInit()
{
	m_hShareHandle = CreateFileMapping(
		INVALID_HANDLE_VALUE,
		NULL,
		PAGE_READWRITE,
		0,
		MEMORY_SIZE,
		GLOBAL_MEMORY_NAME);
	if (NULL == m_hShareHandle)
	{
		return false;
	}

	m_hEvent = CreateEvent(NULL, FALSE, FALSE, GLOBAL_EVENT_NAME);
	if (NULL == m_hEvent)
	{
		return false;
	}

	return true;
}

bool ShareReadMemory::OnReadMemory(OUT char* pszData)
{
	WaitForSingleObject(m_hEvent, INFINITE);

	if (NULL == pszData)
	{
		return false;
	}

	if (NULL == m_hShareHandle)
	{
		return false;
	}

	char* pBuffer = NULL;

	pBuffer = (LPSTR)MapViewOfFile(
		m_hShareHandle,
		FILE_MAP_READ,
		0,
		0,
		MEMORY_SIZE);
	if (NULL == pBuffer)
	{
		return false;
	}

	__try
	{
		CopyMemory((void*)pszData, pBuffer, strlen(pBuffer));
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		UnmapViewOfFile(pBuffer);
		return false;
	}

	UnmapViewOfFile(pBuffer);

	PulseEvent(m_hEvent);


	return true;
}

テストケース実装コード
#include <windows.h>
#include <stdio.h>
#include "ShareReadMemory.h"


int main(int argc, char** argv)
{
	ShareReadMemory ReadMemory;

	if (!ReadMemory.OnInit())
	{
		printf("Read Memory is error!
"); return -1; } char buffer[1024] = {0}; while (ReadMemory.OnReadMemory(buffer)) { if (0 == strncmp("DONE", buffer, 4)) { break; } if (NULL != buffer) { printf("TA ->%s

", buffer); } else { continue; } memset(buffer, 0, 1024); } getchar(); return 0; }

備考:このテスト例の目的は、メモリデータを読み取ることです.