C#和python端通信之使用共享内存

一、前言

    本篇主要实验通过使用共享内存实现C#端代码和python端代码之间的通信,主要目的是相较于直接传输较大的数据(例如图像数据),该方式更节省时间。

二、代码

C#端:

    创建了一个大小为1的共享内存,名为flag1,存放一个byte变量,初始写入0

    创建了一个大小为1的共享内存,名为done,存放一个byte变量,初始写入1

    创建了一个大小为1024 * 16的共享内存,名为result,存放一个string变量,初始写入""

     之后读取图像,并创建和写入至一个大小为960*640*4的共享内存,名为cam1,存放一个byte[]变量 , 然后 flag1 写入1,循环读取done内存,若为1,则将result 内存读取出为string 并显示textBox1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;using System.Drawing.Imaging;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;namespace testShareMemory
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void test_0(){// 读取图片string imagePath = "E:/cshape_test/testShareMemory/001.png";Bitmap bitmap = new Bitmap(imagePath);// 确保图片大小为960x640if (bitmap.Width != 960 || bitmap.Height != 640){Console.WriteLine("图片尺寸不符合要求,必须为960x640");return;}MemoryMappedFile mmfCam1 = MemoryMappedFile.CreateOrOpen("cam1", bitmap.Width * bitmap.Height * 4);MemoryMappedViewAccessor accessor = mmfCam1.CreateViewAccessor();BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);byte[] buffer = new byte[bitmapData.Stride * bitmapData.Height];Marshal.Copy(bitmapData.Scan0, buffer, 0, buffer.Length);accessor.WriteArray(0, buffer, 0, buffer.Length);bitmap.UnlockBits(bitmapData);// 创建共享内存 flag , 并写入1var flagMMF = MemoryMappedFile.CreateOrOpen("flag1", 1);var flagAccessor = flagMMF.CreateViewAccessor();byte flagToWrite = 1;flagAccessor.Write(0, flagToWrite);//创建共享内存 done , 并写入0var doneMMF = MemoryMappedFile.CreateOrOpen("done", 1);var doneAccessor = doneMMF.CreateViewAccessor();byte doneToWrite = 0;doneAccessor.Write(0, doneToWrite);//创建共享内存 result , 并写入""int res_lens = 1024 * 32;MemoryMappedFile mmfResult = MemoryMappedFile.CreateOrOpen("result", res_lens);MemoryMappedViewAccessor resAccessor = mmfResult.CreateViewAccessor();byte[] strBytes = Encoding.UTF8.GetBytes("");//resAccessor.Write(0, strBytes.Length); // 首先写入字符串长度resAccessor.WriteArray(0, strBytes, 0, strBytes.Length); // 然后写入字符串字节内容// 循环间隔1秒,读取共享内存bool done = false;int search_times = 0;while (!done){byte doneValue = doneAccessor.ReadByte(0);byte flagValue = flagAccessor.ReadByte(0);if (doneValue == 1 && flagValue == 2){// 读取共享内存"result"string result;// 读取字符串长度(前4个字节)int length = resAccessor.ReadInt32(0);// 创建字节数组来存储字符串数据byte[] buffer_str = new byte[length];// 从共享内存读取字符串数据resAccessor.ReadArray(4, buffer_str, 0, length);// 将字节数组转换为字符串string resultString = Encoding.UTF8.GetString(buffer_str);textBox1.Text = "查询到的结果为: " + resultString;done = true; // 设置标志,退出循环}else{// 等待一段时间再继续轮询System.Threading.Thread.Sleep(1000); // 等待1秒search_times++;if (search_times > 100){//Console.WriteLine("查询超时!"   );textBox1.Text = "查询超时!";break;}}}}private void Form1_Load(object sender, EventArgs e){test_0();}}
}

python端:

    循环读取flag1共享内存,若为1,则读取cam1数据,还原为图像数据,将2写入flag1,并将json字符串data写入result内存区,将1写入done,显示图像数据

# -*- coding: utf-8 -*-
"""
Created on Tue Feb 27 17:10:01 2024@author: WIN10
"""import os , cv2
import numpy as npfrom multiprocessing import shared_memory
import time
import structimport json# 创建/打开共享内存
def create_or_open_shared_memory(name, size):try:shm = shared_memory.SharedMemory(create=False, name=name)except FileNotFoundError:shm = shared_memory.SharedMemory(create=True, name=name, size=size)return shmdef main():flag_name = "flag1"cam1_name = "cam1"done_name = "done"# 图像大小width, height, channels = 960, 640, 4image_size = width * height * channelsflag_shm = create_or_open_shared_memory(flag_name, size=1)  # 1个字节,用 uint8flag_array = np.ndarray((1,), dtype= np.uint8  , buffer=flag_shm.buf)done_shm = create_or_open_shared_memory(done_name, size=1)done_array = np.ndarray((1,), dtype=np.uint8, buffer=done_shm.buf)# 初始化 cam1 共享内存cam1_shm = create_or_open_shared_memory(cam1_name, size=image_size)cam1_array = np.ndarray((height, width, channels), dtype=np.uint8, buffer=cam1_shm.buf)res_shm =  create_or_open_shared_memory("result", size= 1024*16 )while True:if flag_array[0] == 1:# 读取图像数据image_rgba = np.copy(cam1_array)img  = cv2.cvtColor(image_rgba, cv2.COLOR_RGBA2RGB)  #C#端的bitmap传过来的是4通道的,应该转为3通道# 将 2 写入 flagflag_array[0] = 2#写入 jason字符串到 resultdata = {"name": "Mario","age": 28,}json_str = json.dumps(data)json_bytes = json_str.encode('utf-8')res_shm.buf[:4] = struct.pack('i', len(json_bytes))res_shm.buf[4:4 + len(json_bytes)] = json_bytesdone_array[0] = 1  #done 区域写入1# 显示读取到的图像cv2.imshow('Shared Memory Image', img )cv2.waitKey(0)break# 每隔100毫秒检测一次time.sleep(0.1)# 关闭共享内存cam1_shm.close()flag_shm.close()res_shm.close()done_shm.close()if __name__=="__main__":main()

三、运行结果

   先运行C# ,再运行python端

python端结果,显示接受到的图像

C#端结果,显示收到python端写入的json字符串

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

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

相关文章

Js-w3school(2024(1)

10.访问 HTML 元素 使用“不整洁的” HTML 样式的后果,也许是导致 JavaScript 错误。请在 HTML 中使用相同的命名约定(就像 JavaScript 那样) 11. 请使用正确的文档类型 请始终在文档的首行声明文档类型: 如果您一贯坚持小写标…

神经网络学习-池化层

池化层方法 池化一般是用来对卷积层进行降维 空洞卷积,通过在卷积核的元素之间插入“空洞”(即零),可以在不增加参数量和计算量的情况下扩大卷积核的感受野。这对于捕捉图像中的多尺度信息特别有用。 池化的默认步长是池化核的大…

vscode插件开发之 - 消息通信

在开发vscode插件过程中,有一个典型场景是webview与extension.ts进行通信,例如,webview上的某些信息发送改变时,需要发送消息传递给extension.ts. 如果使用react框架构建vscode插件的webview,如何实现webview与extensi…

工厂ESOP系统促进工厂快速响应和工艺改进

在当今追求可持续发展和创新的时代,新能源产业正以惊人的速度崛起。新能源工厂作为这一领域的核心生产环节,面临着不断提高效率、优化工艺和快速应用新技术的巨大挑战。为了应对这些挑战,越来越多的新能源工厂开始引入 ESOP 系统(…

为什么企业需要数据挖掘平台?哪个比较好呢?

什么是数据挖掘? 数据挖掘就是从大量的数据中去发现有用的信息,然后根据这些信息来辅助决策。听起来是不是跟传统的数据分析很像呢?实际上,数据挖掘就是智能化的数据分析,它们的目标都是一样的。但是&#xff0c…

【SPIE独立出版 | 往届均已完成EI检索】2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024)

2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024) 2024 International conference on Cloud Computing, Performance Computing and Deep Learning *CCPCDL往届均已完成EI检索,最快会后4个半月完成! 一、重要信息 大会官网:www…

盘点海外大带宽服务器:哪家值得选?

针对外贸业务遭遇大流量访问时的巨大带宽需求,我们可能有很多人会选择寻找一些海外大带宽服务器提供商来提升网站的访问效率。所以,本文整理了五个海外大带宽服务器的产品商家,如果有需要可以选择参考。 亚马逊 AWS(Amazon Web Services) 亚马…

《深入理解Spark RDD缓存机制》(第4天)

文章目录 前言一、小试牛刀:解剖RDD缓存机制?1. 什么是Spark RDD缓存策略1.1 为什幺RDD要做缓存1.2 缓存相关API:1.3 缓存案例解析:1.4 图解缓存效果: 2. 什么是checkpoint缓存2.1 为什么要做checkpoint缓存2.2 checkpoint相关API:2.3 checkp…

七彩影视双端新版本源码 支持PC+WAP+APP三端 对接苹果CMS后台

下载地址:七彩影视双端新版本源码 支持PCWAPAPP三端 对接苹果CMS后台 适合做影视类,高端大气

强化学习——基本概念

何为强化学习 机器学习的一大分支 强化学习(Reinforcement Learning)是机器学习的一种,它通过与环境不断地交互,借助环境的反馈来调整自己的行为,使得累计回报最大。强化学习要解决的是决策问题——求取当前状态下最…

群晖NAS本地部署并运行一个基于大语言模型Llama2的个人本地聊天机器人

前言 本文主要分享如何在群晖 NAS 本地部署并运行一个基于大语言模型 Llama 2 的个人本地聊天机器人并结合内网穿透工具发布到公网远程访问。本地部署对设备配置要求高一些,如果想要拥有比较好的体验,可以使用高配置的服务器设备. 目前大部分大语言模型的产品都是基于网络线上…

【ai】tx2-nx:安装深度学习环境及4.6对应pytorch

参考:https://www.waveshare.net/wiki/Jetson_TX2_NX#AI.E5.85.A5.E9.97.A8 英伟达2021年发布的的tritionserver 2.17 版本中,backend 有tensorflow1 和 onnxruntime ,他们都是做什么用的,作为backend 对于 triton 推理server意义是什么,是否应该有pytorch? Triton Infer…

PS给logo加白色描边

步骤1:打开你的Logo文件 步骤2:选择Logo层 在“图层”面板中找到你的Logo所在的图层。如果你的Logo是在背景图层上,可以将它转换为普通图层(右键点击背景图层,选择“从背景图层转换”)(此处也…

五大数据防泄漏系统排名|高效实用的防泄漏软件有哪些

在数字化时代,数据泄露已成为企业面临的重要安全挑战之一。为了有效应对这一挑战,企业需要借助先进的数据泄露防护系统来保护其敏感信息免受非法访问、使用和泄露。以下是五大备受推崇的数据泄露防护系统,它们各具特色,功能强大&a…

查看nginx安装/配置路径,一个服务器启动两个nginx

查看nginx安装/配置路径 查看nginx的pid: ps -ef | grep nginx查看pid对应服务的启动路径 ll /proc/2320/exe使用检查配置文件命令,查看配置文件位置 /usr/local/nginx/sbin/nginx -t一个服务启动两个nginx 拷贝一份程序,cpbin是我自己创…

阿里云服务器提醒漏洞要不要打补丁?

我们自己用的电脑一旦发现漏洞,往往是第一时间进行打补丁重启等等,但是作为服务器而言,往往没有这个习惯,为什么?因为害怕服务器打补丁以后,重启后出现打不开的情况,毕竟稳定的运行似乎在这种情…

java.io.eofexception:ssl peer shut down incorrectly

可能是因为 1)https设置 2)超时设置 FeignConfig.java package zwf.service;import java.io.IOException; import java.io.InputStream; import java.security.KeyStore;import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory;import org.apac…

北斗短报文终端在应急消防通信场景中的应用

在应对自然灾害和紧急情况时,北斗三号短报文终端以其全球覆盖、实时通信和精准定位的能力,成为应急消防通信的得力助手。它不仅能够在地面通信中断的极端条件下保障信息传递的畅通,还能提供精准的位置信息,为救援行动提供有力支持…

Adams 插件Plugin二次开发教程

通过cmd或python开发的Adams程序,可以通过执行cmd(python)命令的方式直接运行,也可以根据cmd教程中提供的创建菜单和对话框的方式调用这些程序,当然更合适的方式是通过插件的方式对二次开发的程序进行管理,…

Java程序员Python一小时速成

背景 由于最近要开发一些AI LLM(Large Language Model 大语言模型)应用程序,然后又想使用LangChain(LangChain 是一个用于构建和操作大语言模型(LLMs)的框架,旨在帮助开发者更方便地集成和使用…