一、前言

进程间通信技术的应用非常广泛,在Windows下常用的实现方式有:管道、Socket、消息、本地文件、共享内存等,每种方式都有各自适应的场景。

在进行大数据交换时,最优的方式便是共享内存。

但是共享内存在应用时往往需要配合其他的进程间通信方式,比如管道、消息等,用以通知共享内存中的数据发生了改变,所以共享内存在实际应用时是很繁琐的。

本框架——SimpleMMF,便是为解决这个痛点所开发的。本框架完全基于共享内存实现。

SimpleMMF的使用非常简单:实例化完毕后,响应事件即可,事件中会附带共享内存中的数据;需要向共享内存中写入数据时,调用一个方法即可。

SimpleMMF已经开源:

Github:https://github.com/lesliexinxin/LeslieXin.SimpleMMF

相信看完的你,一定会有所收获!

本文地址:https://www.cnblogs.com/lesliexin/p/15106309.html


二、使用示例

(一)流程

1,整体流程

2,程序说明

服务端:DemoServer.exe。

作用:读取由客户端写入共享内存中的数据,并对数据进行处理,然后再次写入共享内存。

客户端:DemoClient.exe。

作用:往共享内存写数据,并从共享内存中读取修改后的数据,

(二)实现

1,获取框架并添加引用。

可以从Github中直接获取release,并手动添加dll引用。

2,服务端

(1)外观设计

(2)代码实现

(2.1)以服务端方式实例化。

(2.2)实现ServerMsg事件。

(注:以服务端方式实例化时,只会触发ServerMsg事件,所以只能响应ServerMsg事件;同理,以客户端方式实例化时,只会触发ClientMsg事件,所以只能响应ClientMsg事件。)

3,客户端

(1)外观设计

(2)代码实现

(2.1)以客户端方式实例化。

(2.2)实现ClientMsg事件。

(注:以服务端方式实例化时,只会触发ServerMsg事件,所以只能响应ServerMsg事件;同理,以客户端方式实例化时,只会触发ClientMsg事件,所以只能响应ClientMsg事件。)

获取共享内存数据,并显示。取到的数据会包含客户端实例化时的clientName,可以通过此值判断当前共享内存中的数据是否是当前客户端程序所需要的。

(2.3)写入数据

在文本框内容发生改变时,将文本内容写入共享内存。

(三)演示


三、实现原理

SimpleMMF在实例化时会分配3个共享内存:STATE、VALUE、CLIENT。如图所示:

SimpleMMF在实例化后,会一直遍历STATE的值,当STATE的值不等0时,进行下一步的处理:

STATE的值等1,代表着有服务端写入了数据,读取此数据,并触发ClientMsg事件。

STATE的值等2,代表着有客户端写入了数据,读取些数据,并触发ServerMsg事件,

在客户端写入数据时,除了向VALUE中写入数据外,还会向CLIENT中写入当前客户端的名称。用于在响应ClientMsg事件时,判断是哪个客户端写入的数据。

具体流程如下:


四、总结

SimpleMMF的实现并不复杂,但是在实现后,使用起来却非常的简单方便,极大的提高了开发效率。

SimpleMMF是基于.Net4.5实现的,如果需要调整为更早的.Net版本,下面提供下修改思路:

1,.Net4.0:修改事件ServerMsg、ClientMsg的定义方式,使用传统的事件定义方式重新定义即可。

2,.Net4.0之前版本:修改读取共享内存、写入共享内存方法,需要用到Win32的相关API函数去读写共享内存。

感谢观看,欢迎大家评论指正。


-【END】-

(原创)[.Net] 进程间通信框架(基于共享内存)——SimpleMMF的更多相关文章

  1. ACE框架 基于共享内存的分配器 (算法设计)

    继承上一篇<ACE框架 基于共享内存的分配器设计>,本篇分析算法部分的设计. ACE_Malloc_T模板定义了这样一个分配器组件 分配器组件聚合了三个功能组件:同步组件ACE_LOCK, ...

  2. ACE框架 基于共享内存的进程间通讯

    ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_ ...

  3. ACE框架 基于共享内存的分配器

    ACE框架提供了一个内存分配器模板,并且提供了(仅且)一个模板实例,基于共存内存的内存分配器.这个共存内存分配器模板实例在ACE框架应用于,基于内存映射的进程通讯,以及进程间同步等. ACE内存分配器 ...

  4. Unix IPC之基于共享内存的计数器

    目的 本文主要实现一个基于共享内存的计数器,通过父子进程对其访问. 本文程序需基于<<Unix网络编程-卷2>>的环境才能运行.程序中大写开头的函数为其小写同名函数的包裹函数, ...

  5. 进程间通信——IPC之共享内存

        共享内存是三个IPC机制中的一个.它允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在进行的进程之间传递数据的一种非常有效的方式.   大多数的共享内存的实现,都把由不同进程之间共享 ...

  6. 进程间通信IPC之--共享内存

    每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲 ...

  7. Linux进程间通信(System V) --- 共享内存

    共享内存 IPC 原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,下图所示为进程间使用共享内存实现大量数据传输的示意图: 共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有 ...

  8. Linux 进程间通信(管道、共享内存、消息队列、信号量)

           进程通信 : 不同进程之间传播或交换信息    为什么要进程通信呢? 协同运行,项目模块化 通信原理 : 给多个进程提供一个都能访问到的缓冲区. 根据使用场景,我们能划分为以下几种通信 ...

  9. 【Linux 应用编程】进程管理 - 进程间通信IPC之共享内存 mmap

    IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名 ...

随机推荐

  1. 使用 vite 构建一个表情选择插件

    初始化 Vite 基于原生 ES 模块提供了丰富的内建功能,开箱即用.同时,插件足够简单,它不需要任何运行时依赖,只需要安装 vite (用于开发与构建)和 sass (用于开发环境编译 .scss ...

  2. 02 SVN 与 Git 的优缺点

    上一篇博客大致聊了聊关于版本控制系统的周边,这一篇我们就来继续唠唠作为近年来最受欢迎的两个版本控制系统的优缺点吧. 聊优缺点之前,先简单了解一下这两个这两个版本控制系统好了: 关于 SVN SVN 概 ...

  3. Unity不规则按钮点击区域(UGUI)

    文章目录 一. 前言 二. 最终效果 三. 实现 1.创建UICamera 2. UIPolygon节点 3. 编辑碰撞区域 5. 运行测试 6. UIPolygon代码 一. 前言 游戏开发中,可能 ...

  4. Spring学习日记02_IOC_属性注入_其他类型属性

    ICO操作Bean管理(xml注入其它类型属性) 字面量 null值 <property name="address"> <null></null&g ...

  5. 利用C语言输出一个二元一次函数

    #include<stdio.h> #include<math.h> int main(void)//其实void我认为在这可有可无 {  double a,b,c,x1,x2 ...

  6. 同步工具——Exchanger

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 本文是转载文章,原文请见这里 一.Exchanger简介 ...

  7. Git错误:unable to access 'https://git.voicegu.com/qa/qa.git/': SSL certificate problem: unable to get local issuer certificate

    fatal: unable to access 'https://git.voicegu.com/qa/qa.git/': SSL certificate problem: unable to get ...

  8. PYTHON IDLE同时运行两个PY,互不影响

    1.打开指定文件夹 2.右击a1.py,用IDLE打开(idle1) 3.右击a2.py,用IDLE打开(idle2) 4.则分别按F5运行,则两个互不影响. 5.再用IDLE1打开新程序,用IDLE ...

  9. facade层,service 层,domain层,dao 层设计

    转自http://fei-6666.iteye.com/blog/446247,记录下来 一,Service->DAO,只能在Service中注入DAO. 二,DAO只能操作但表数据,跨表操作放 ...

  10. deepin安装Motrix,cocomusic

    1,motrix(下载工具):https://motrix.app/ 2,cocomusic(开源音乐播放器):https://github.com/xtuJSer/CoCoMusic/release ...