プロセス間通信の古典的な方法;共有メモリ+イベント;
マルチスレッド/マルチプロセス通信については、プログラマーたちが過去に困難だった.MFC技術に詳しいプログラマーは心配していないかもしれません.MFCの技術は十分強いからです.もしあなたがCとAPIで開発していたら.
狂ったことに遭遇することが多い.最近暇なので、この方面のものを復習しました.記録してみんなと一緒に勉強する.本人の能力に限りがあるので、間違いは皆さんに指摘してください.
Aプロセスは一つのことをしたいです.このことをする前提は、Bプロセスが必須条件を提供しなければならないことです.Bプロセスがこの要件を完了すると、Aプロセスに通知し、Aプロセスが開始する.これは典型的な
マルチプロセス/スレッド間の通信インスタンス.次にコードでこれらのことのいきさつを分析します.
まず、読み出し共有メモリのセクションについて説明します.以下はクラス実装です.
ファイルの定義
ヘッダファイル
インプリメンテーションファイル
テストケース実装
メモ:このテスト例は、行ごとにファイルの内容を読み取り、共有メモリに書き込むことを目的として設計されています.
実際には、メモリが書き込まれているため、OnWriteMemoryのパラメータをvoid*タイプに変更することができ、構造体をメモリに書き込むことができます.
具体的な詳細を知りたいなら、もっと深く検討する必要があると思います.コードはここまで書きすぎると説明しません.よく読んでほしいです.私の考えを体得する.
次は、共有メモリを読み込む部分です.
リードメモリヘッダファイル設計
メモリインプリメンテーションファイルの読み取り
テストケース実装コード
備考:このテスト例の目的は、メモリデータを読み取ることです.
狂ったことに遭遇することが多い.最近暇なので、この方面のものを復習しました.記録してみんなと一緒に勉強する.本人の能力に限りがあるので、間違いは皆さんに指摘してください.
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;
}
備考:このテスト例の目的は、メモリデータを読み取ることです.