(原创)[.Net] 进程间通信框架(基于共享内存)——SimpleMMF
一、前言
进程间通信技术的应用非常广泛,在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的更多相关文章
- ACE框架 基于共享内存的分配器 (算法设计)
继承上一篇<ACE框架 基于共享内存的分配器设计>,本篇分析算法部分的设计. ACE_Malloc_T模板定义了这样一个分配器组件 分配器组件聚合了三个功能组件:同步组件ACE_LOCK, ...
- ACE框架 基于共享内存的进程间通讯
ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_ ...
- ACE框架 基于共享内存的分配器
ACE框架提供了一个内存分配器模板,并且提供了(仅且)一个模板实例,基于共存内存的内存分配器.这个共存内存分配器模板实例在ACE框架应用于,基于内存映射的进程通讯,以及进程间同步等. ACE内存分配器 ...
- Unix IPC之基于共享内存的计数器
目的 本文主要实现一个基于共享内存的计数器,通过父子进程对其访问. 本文程序需基于<<Unix网络编程-卷2>>的环境才能运行.程序中大写开头的函数为其小写同名函数的包裹函数, ...
- 进程间通信——IPC之共享内存
共享内存是三个IPC机制中的一个.它允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在进行的进程之间传递数据的一种非常有效的方式. 大多数的共享内存的实现,都把由不同进程之间共享 ...
- 进程间通信IPC之--共享内存
每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲 ...
- Linux进程间通信(System V) --- 共享内存
共享内存 IPC 原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,下图所示为进程间使用共享内存实现大量数据传输的示意图: 共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有 ...
- Linux 进程间通信(管道、共享内存、消息队列、信号量)
进程通信 : 不同进程之间传播或交换信息 为什么要进程通信呢? 协同运行,项目模块化 通信原理 : 给多个进程提供一个都能访问到的缓冲区. 根据使用场景,我们能划分为以下几种通信 ...
- 【Linux 应用编程】进程管理 - 进程间通信IPC之共享内存 mmap
IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名 ...
随机推荐
- python读取csv文件绘制气温图,x轴为日期,并填充颜色
- .NET 云原生架构师训练营(设计原则与模式)--学习笔记
在复杂系统的架构设计中引入设计原则与模式,能够极大降低复杂系统开发.和维护的成本 目录 几个问题 为什么要学习设计模式 优良架构设计的具体指标 理解复杂系统 面向对象思想(指导复杂系统的分析.设计.实 ...
- Unity中的.Meta文件
.meta文件是用于辅助管理Unity资源文件的文件,删除后,Unity会自动生成,里面记录了各个资源Inspector的信息,属性等等,Unity是不会改变源资源文件的,没有意义,它是靠.meta文 ...
- error C3646: 未知重写说明符
记录一个报错 error C3646: 未知重写说明符 ①循环引用 在项目文件变多时,由于组织不当,很容易出现头文件的循环引用 有时候虽然没有出现循环引用,但是头文件多处被include :适当的使用 ...
- 详解C++中继承的基本内容
有些类与类之间存在特殊的关系,有共性也有特性,比如动物类可以细分为猫,狗等.下级别的成员除了拥有上一级的共性,还有自己的特性,这个时候就可以考虑继承的技术,减少重复代码. 一.继承中的对象模型 1.1 ...
- Series 1 java秒组合数
Series 1 举几个例子发现, 系数中间对称,很容易想到组合数 c(n,m)==c[n,n-m).此题就是高精度求组合数,java秒之. time:1825ms ,接近时限,如果n还稍微大一 ...
- JAVA并发(8)-ThreadPoolExecutor的讲解
很久前(2020-10-23),就有想法学习线程池并输出博客,但是写着写着感觉看不懂了,就不了了之了.现在重拾起,重新写一下(学习一下). 线程池的优点也是老生常谈的东西了 减少线程创建的开销(任务数 ...
- Shell中[和[[的异同
1. 概念上来说 "[[",是关键字,许多shell(如ash bsh)并不支持这种方式.ksh, bash(据说从2.02起引入对[[的支持)等支持."[&qu ...
- Java | 日期类型的绍介和操作
Date类 Date类在java.util.Date,Date类表示特定的瞬间,精确到毫秒.(毫秒是千分之一秒)毫秒可以对时间和日期进行计算,可以把日期转换为毫秒进行计算,计算完毕,再把毫秒转换为日期 ...
- python 读取 写入txt文件
filename = 'pi_digits.txt' with open(filename) as f:#默认以只读方式打开文件 lines = f.readlines()#读取所有行,结果为列表,每 ...