Windows共享内存实现跨进程通信

概述:

最近了解到共享内存的跨进程通信的效率是最高的.

原因是同一个共享内存在不同进程中使用的是同一块物理内存.

因此, 我想试试共享内存通信的效果.

 

思路:

不过这里有个问题, 共享内存在写入之后, 读取一侧并不知道有新的数据来了,

因此, 需要实现两个跨进程通知的同步对象. 一个用于服务端通知客户端, 一个用于客户端通知服务端.

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),
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值