

(原创)[.Net] 进程间通信框架(基于共享内存)——SimpleMMF
source link: https://www.cnblogs.com/lesliexin/p/15106309.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

(原创)[.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】-
Recommend
-
104
让进程间通信更容易 - Pandora.js 的 IPC-Hub
-
122
Android跨进程IPC通信Messenger
-
71
Android跨进程IPC通信AIDL
-
89
Android 进程间通信
-
68
Android 多进程通信
-
59
C/C++/Obj-C - @wisefree - 请教各位 V 友一个问题,我正在使用海康威视摄像头,官方给了很全的代码范例,包括 C++、Java、C#但是没有给出 Python 的,如果用 Python 中的 ctypes 库来调用官方的 D
-
15
Android 基于Message的进程间通信 Messenger完全解析 ...
-
4
Linux 中的进程通信主要包括以下几种方式:管道(pipe); 流管道 (s_pipe) 和有名管道 (FIFO)信号(signal)套接字(socket)本文主要介绍共享内存的使用方式, 其中也会用到信号.使用 shm 机制shm 基于...
-
6
在上篇博文我们了解了通过管道完成进程间通信,我们了解匿名管道和命名管道,并且通过编码模拟实现使用了匿名管道和命名管道。我们知道要让进程间完成通信必须让这两个进程首先看到同一份资源,因此给予这个前提,本篇博文我们了解另外一种可以进程间通信的方式 --...
-
7
Python高级(9)—进程间通信之共享内存,多进程、多线程操作共享数据的不安全性◎知识点进程间通信之共享内存多进程操作共享数据的不安全性
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK