概述:
最近了解到共享内存的跨进程通信的效率是最高的.
原因是同一个共享内存在不同进程中使用的是同一块物理内存.
因此, 我想试试共享内存通信的效果.
思路:
不过这里有个问题, 共享内存在写入之后, 读取一侧并不知道有新的数据来了,
因此, 需要实现两个跨进程通知的同步对象. 一个用于服务端通知客户端, 一个用于客户端通知服务端.
Windows上命名Event最适合充当这个角色.
MsgOpt:
MsgOpt.h
#pragma once
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <sstream>
// #pragma comment(lib, "user32.lib")
using namespace std;
enum MsgType {
msg_client = 1,
msg_svr = 2,
win_handle = 3,
};
struct MsgStruct {
MsgType type;
int val;
};
class EvtOpt {
private:
HANDLE _hEvent;
public:
EvtOpt() {}
~EvtOpt() {
Uninit();
}
bool Create(string name); // for event svr
bool Connect(string name); // for event client
bool Wait(DWORD time = INFINITE);
bool Signal();
bool Uninit();
};
typedef bool(*PFRcvMsg)(MsgStruct& msg);
class MsgOpt {
private:
HANDLE _hMapFile;
LPVOID _pBuf;
int _bufSize;
bool _exited;
EvtOpt _evtOpt;
PFRcvMsg _onRcvMsg;
public:
MsgOpt(int bufSize) :_bufSize(bufSize) {}; // used by client
MsgOpt(int bufSize, PFRcvMsg onRcvMsg) : // used by svr
_bufSize(bufSize),
_onRcvMsg(onRcvMsg),
_exited(false) { }
~MsgOpt() { Uninit(); }
bool Listen(string name); // used by svr
bool WaitMsg(int time = INFINITE);
bool Connect(string name); // used by client
bool PostMsg(MsgStruct& msg);
bool Uninit();
};
class MsgMgr {
private:
MsgOpt _msgSvr;
MsgOpt _msgClient;
public:
MsgMgr(int bufSize, PFRcvMsg onRcvMsg) :
_msgSvr(bufSize, onRcvMsg),