利用内存映射文件进行程序间通信2一代码

news2024/11/25 4:45:06

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

为了测试代码,需要分别创建两个应用程序文件。

窗体如下:

两个项目的代码在最前面添加:

Imports System.IO.MemoryMappedFiles

一、写入窗体的代码:

    Dim sharedMemory As MemoryMappedFile

    Dim viewAccessor As MemoryMappedViewAccessor



    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        '内存映射文件的名称

        Dim sharedMemoryName As String = "TestSharedMemory"

        '内存映射文件的大小

        Dim sharedMemorySize As Integer = 1024

        '使用CreateOrOpen创建或打开文件

        sharedMemory = MemoryMappedFile.CreateOrOpen(sharedMemoryName, sharedMemorySize)

        '创建映射到内存映射文件视图的访问器

        viewAccessor = sharedMemory.CreateViewAccessor

    End Sub



    Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing

        '释放

        sharedMemory.Dispose()

    End Sub



    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        '字符串转字节数组

        Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(TextBox1.Text)

        '字节数组写入内存映射文件

        viewAccessor.WriteArray(Of Byte)(0, data, 0, data.Length)

End Sub

二、读取窗体的代码

   Dim sharedMemory As MemoryMappedFile

    Dim viewAccessor As MemoryMappedViewAccessor



    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        '内存映射文件的名称

        Dim sharedMemoryName As String = "TestSharedMemory"

        '内存映射文件的大小

        Dim sharedMemorySize As Integer = 1024

        '使用CreateOrOpen创建或打开文件

        sharedMemory = MemoryMappedFile.CreateOrOpen(sharedMemoryName, sharedMemorySize)

        '创建映射到内存映射文件视图的访问器

        viewAccessor = sharedMemory.CreateViewAccessor

    End Sub



    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim data(1023) As Byte

        '读取内存映射文件到字节数组

        viewAccessor.ReadArray(Of Byte)(0, data, 0, 1024)

        '将字节数组转字符串

        Dim message As String = System.Text.Encoding.UTF8.GetString(data)

        TextBox1.Text = message

End Sub

两个窗体运行后,点击写入窗体的“写入数据”按钮,再按下读取窗体的“读取数据”按钮,运行结果如下:

但是当写入数据比较少的时候,读取出的数据会存在问题,会包含上一次的多余数据:

这就需要更好的方法来写入和读取数据。

三、修改后的写入窗体的代码:

增加“写入数据改进”按钮。

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        '字符串转字节数组

        Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(TextBox1.Text)

        'sendData保存实际发送的字节数组

        '实际保存的字节数组=数据大小(4)+ data(data.Length)

        Dim sendData() As Byte

        ReDim sendData(4 + data.Length - 1)

        '前4个字节,保存了实际数据的大小

        Dim headData() As Byte

        headData = BitConverter.GetBytes(data.Length)

        'headData拷贝到sendData

        Array.Copy(headData, sendData, headData.Length)

        'data拷贝到sendData,拷贝到的位置从4开始

        Array.Copy(data, 0, sendData, 4, data.Length)

        '字节数组写入内存映射文件

        viewAccessor.WriteArray(Of Byte)(0, sendData, 0, sendData.Length)

    End Sub

四、修改后的读取窗体的代码:

增加“读取数据改进”按钮。

    Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click

        Dim data(1023) As Byte

        '读取内存映射文件到字节数组

        viewAccessor.ReadArray(Of Byte)(0, data, 0, 1024)

        '读取前4个字节,保存了实际数据的大小

        Dim headData(3) As Byte

        Array.Copy(data, headData, 4)

        '获取实际数据的大小

        Dim dataLength As Integer

        dataLength = BitConverter.ToInt32(headData, 0)

        '将实际数据保存到字节数组

        Dim realData(dataLength - 1) As Byte

        Array.Copy(data, 4, realData, 0, dataLength)

        '字节数组转字符串

        Dim message As String = System.Text.Encoding.UTF8.GetString(realData)

        TextBox1.Text = message

    End Sub

两个窗体运行后,点击写入窗体的“写入数据改进”按钮,再按下读取窗体的“读取数据改进”按钮,运行结果如下:

 可以看到此时获得的数据正常。

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/771856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新晋 Committer!来自复旦大学的帅哥一枚

点亮Star⭐️ 支持我们 https://github.com/apache/dolphinscheduler 最近,社区星力量又迎来一位新晋 Committer,这次是来自复旦大学研究生在读的王维饶同学,一起来认识一下吧! 个人简介 姓名:王维饶职位&#xff1a…

从0到1构建证券行业组织级项目管理体系的探索与实践︱东吴证券PMO负责人娄鹏呈

东吴证券股份有限公司信息技术总部PMO负责人娄鹏呈先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾,演讲议题:从0到1构建证券行业组织级项目管理体系的探索与实践。大会将于8月12-13日在北京举办,敬请关注! 议题简要&a…

简笔风和写实风的区别

现实主义和风格化 当我们谈论现实主义和风格化时,我们是什么意思?这看起来相当明显,现实主义指的是模仿逼真的逼真的图形。它不一定需要存在于现实世界中,但被传达为它属于我们的世界。10年前,我们认为现实的东西在今…

数据结构之vector的实现

数据结构之vector的实现 Vector类分为&#xff1a;构造函数、析构函数、只读函数、修改函数、私有函数、成员变量&#xff08;数据区和大小&#xff09; # include <iostream> # include <algorithm> # include <cstdlib># define DEFAULT_CAPACITY 3templat…

数学建模-图论 最短路径

作图 %% 注意&#xff1a;以下代码需要较新版本的matlab才能运行&#xff08;最好是2016版本及以上哦&#xff09; % 如果运行出错请下载新版的matlab代码再运行%% Matlab作无向图 % &#xff08;1&#xff09;无权重&#xff08;每条边的权重默认为1&#xff09; % 函数graph(…

SCT52A40,对标UCC27200、UCC27201半桥驱动IGBT/MOSFET栅极驱动器

特点&#xff1a; • 8-24V宽供电电压 • 驱动高侧和低侧N通道MOSFET • 4A峰值输出源电流和汇电流 • 升压电源电压范围可达120V • 集成阴极负载二极管 • TTL兼容输入&#xff0c;-10V输入 • 45ns传输延迟 • 1000pF负载下7ns上升和4.5ns下降时间 • 2ns延迟匹配时间 • 静…

[centos]安装mysql8.0.26

1、首先&#xff0c;根据自己的机子到MySQL官网下载对应的数据库https://dev.mysql.com/downloads/mysql/ 2、卸载mariadb&#xff0c;并解压Mysql 3、安装 rpm -ivh mysql-community-common-8.0.26-1.el7.x86_64.rpm --nodeps rpm -ivh mysql-community-libs-8.0.26-1.el7.x…

《向量数据库指南》:向量数据库Pinecone快速入门

目录 ⚠️警告 ℹ️注意 ⚠️警告 如何开始使用Pinecone向量数据库。 本指南介绍如何在几分钟内设置Pinecone向量数据库。 安装Pinecone客户端(可选)此步骤是可选的。只有在您想使用Python客户端时才执行此步骤。 使用以下shell命令安装Pinecone: Python pip insta…

potplayer放大画面,画面拖拽。备份

放大画面&#xff1a; 按住alt和鼠标左键&#xff0c;就可以拖动放大后的画面了 窗口化示图

UE4/5AI制作基础AI跳跃(适合新手)

目录 制作 添加逻辑 添加导航链接代理 结果 在上一章中&#xff0c;我们讲解了简单的AI跟随玩家&#xff0c;制作了一个基础的ai。 UE4/5AI制作基础AI&#xff08;适合新手入门&#xff0c;运用黑板&#xff0c;行为树&#xff0c;ai控制器&#xff0c;角色类&#xff0c;任…

TCP实现FTP功能

目录 server client makefile 运行顺序 FTP&#xff08;File Transfer Protocol&#xff09;是一种用于在计算机网络上传输文件的标准协议。 它允许用户通过网络将文件从一个计算机&#xff08;称为FTP服务器&#xff09;传输到另一个计算机&#xff08;称为FTP客户端&…

【Python】pyinstaller全新的打包方案,堪称完善!

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤-*- mode: python ; coding: utf-8 -*-剩下的项就省略了-*- mode: python ; coding: utf-8 -*-用一个函数选择性对依赖文件目标路径改名打印 a.binaries&#xff0c;检查依赖文件目标路径剩下的省略了2. 第二步&#xff…

Taurus .Net Core 微服务开源框架:Admin 插件【4-3】 - 配置管理-Mvc【Plugin-MicroService 微服务】

目录 1、系统配置节点&#xff1a;Mvc - Plugin - MicroService 配置界面&#xff1a;注册中心 2、系统配置节点&#xff1a;Mvc - Plugin - MicroService 配置界面&#xff1a;注册中心&#xff08;从&#xff09; 3、系统配置节点&#xff1a;Mvc - Plugin - MicroService…

代码随香录day21

235. 二叉搜索树的最近公共祖先 本题思路&#xff1a; 还是要利用二叉搜索树的特性&#xff0c;中序遍历为有序数组。如果pq两个节点都小于root&#xff0c;那么最近公共祖肯定是在他的左子树&#xff0c;如果都大于那么&#xff0c;肯定就在右子树。然后直接return root 代码…

C++编程(四) —— OOP

文章目录 前言一、this指针二、构造和析构三、深拷贝浅拷贝浅拷贝深拷贝 编程实践 前言 什么是OOP思想&#xff1f; OOP语言的四大特征&#xff1a; 抽象&#xff0c;封装/隐藏&#xff0c;继承&#xff0c;多态 一、this指针 this指针》类》很多对象 一套成员方法是如何处…

04.MySQL——用户管理

用户管理 用户管理的价值 用户 用户信息 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中 use mysql;select host,user,authentication_string from user;host&#xff1a; 表示这个用户可以从哪个主机登陆&#xff0c;如果是localhost&#xff0c;表示只能从…

【贪心算法Part03】| 1005.K次取反后最大化的数组和、134.加油站、135.分发糖果

目录 &#x1f388;LeetCode1005.K次取反后最大化的数组和 &#x1f388;LeetCode134.加油站 &#x1f388;LeetCode135.分发糖果 &#x1f388;LeetCode1005.K次取反后最大化的数组和 链接&#xff1a;1005.K次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k…

31,list容器

31.1list基本概念 功能&#xff1a;将数据进行链式存储 链表(list)是一种物理存储上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成&#xff1a;链表由一系列结点组成 结点的组成&#xff1a;一个是存储数据元素的数据域&#xf…

【剧前爆米花--web】HTTP协议格式详解以及构造

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaEE初阶》 文章分布&#xff1a;这是一篇关于HTTP协议的文章&#xff0c;在这篇文章中我会说明HTTP协议格式以及相关的构造&#xff0c;希望对你有所帮助&#xff01; 目录 HTTP协议 HTTP协议格式 HTTP请求 HTTP响应详情…

拿了 7 个大厂 offer,我有话说

我有一个朋友&#xff0c;举办了一个分享会。他春招期间收割了阿里、京东、美团、拼多多、网易、腾讯云智等多家公司的实习 offer。 他最近从一家A大厂实习换到了另外一家B大厂实习&#xff0c;分享会长达100分钟&#xff0c; 共解答了 40 多个问题。 我也从中抽取一些比较有共…