QT(6.5) cmake构建C++编程,c++与python进行通信(命名管道)

QT(6.5) cmake构建C++编程,c++与python进行通信(命名管道)

  1. 首先,c++端编写命名管导通信代码
#include <QDebug>
#include <windows.h>bool fifp_cpp(){// 创建命名管道(用于读写)HANDLE hPipe;hPipe = CreateNamedPipeW(L"\\\\.\\pipe\\pretectPipe",   // 管道名称,L不可少,其中pretectPipe为自定义名称PIPE_ACCESS_DUPLEX,         // 读写模式PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,1,                         // 最大实例数0,                         // 输出缓冲区大小(在此处,我们将依赖系统的默认大小)0,                         // 输入缓冲区大小(在此处,我们将依赖系统的默认大小)0,                         // 默认超时时间NULL);                     // 安全描述符,默认为空if (hPipe == INVALID_HANDLE_VALUE) {qDebug() << "CreateNamedPipe failed with error(INVALID_HANDLE_VALUE): " << GetLastError() << "\n";return false;}// 此时C++进程已经准备好了命名管道qDebug() << "管道创建成功" << "\n";// 等待客户端连接if (ConnectNamedPipe(hPipe, NULL) == FALSE) {  //没有客户端连接(连接超时)if (GetLastError() != ERROR_PIPE_CONNECTED) {  //不是已有客户端连接导致连接超时qDebug() << "ConnectNamedPipe failed with error(超时): " << GetLastError() << "\n";CloseHandle(hPipe);return false;}}qDebug() << "管道已被连接" << "\n";// C++写入数据std::string message_from_cpp = "1";  //假如约定c++发送"1"为全部数据,python发送"2"为全部数据,"0"为结束标记,皆以\0为结束标记//注C++字符串结尾会自动包含\0,字符串的length不包含\0的长度,所以下面写入管道时将长度+1DWORD bytesWritten;WriteFile(hPipe, message_from_cpp.c_str(), static_cast<DWORD>(message_from_cpp.length() + 1), &bytesWritten, NULL); // 包含结束符'\0'qDebug() << "发送开始信号" << "\n";  //约定c++发送1// C++读取数据(假定Python会在后续阶段写入数据)char buffer[1024];DWORD bytesRead;bool pipeStop = false;int read_total = 0;do {if (PeekNamedPipe(hPipe, NULL, 0, NULL, &bytesRead, NULL)) {if (bytesRead > 0) {ReadFile(hPipe, buffer + read_total, sizeof(buffer) - read_total, &bytesRead, NULL);read_total += bytesRead;//qDebug() << "Received from Python: " << buffer << "\n";if(buffer[read_total - 1] == '\0'){if(buffer[0] == '2'){//因为约定只发1个字符,所以buffer[0]是确定的,实践中根据实际情况读取你的数据qDebug() << "收到python数据" << "\n";WriteFile(hPipe, message_from_cpp.c_str(), static_cast<DWORD>(message_from_cpp.length() + 1), &bytesWritten, NULL); // 继续发送,包含结束符'\0'}else if(buffer[0] == '0'){qDebug() << "python给出关闭信号" << "\n";pipeStop = true;}read_total = 0; //计数归零,下一轮循环}}} else {Sleep(25); // 短暂休眠,以免过度消耗CPU//qDebug() << "等待信号" << "\n";}} while (!pipeStop);CloseHandle(hPipe);qDebug() << "fifp通信结束" << "\n";return true;
}
  1. 其次python编写命名管道通信代码
import win32file
import win32pipe
import timedef fifp_python():hPipe = None# 确保C++进程已创建管道并准备好接收数据# Python进程尝试连接命名管道pipStop = falsewhile not hPipe:try:# 尝试连接命名管道,如果管道还未创建,则会失败,此时等待一段时间后重试hPipe = win32file.CreateFile("\\\\.\\pipe\\pretectPipe", # 与c++端保持一致win32file.GENERIC_READ | win32file.GENERIC_WRITE,  # 读写模式0,  # 不共享此管道None,  # 默认安全性win32file.OPEN_EXISTING,  # 打开已存在的管道0,  # 标准文件属性None)  # 无模板文件句柄except OSError as ex:if ex.winerror != 2:  # 如果错误号不是2(文件未找到),则抛出异常print("命名管道连接错误")return Falsetime.sleep(0.025)  # 管道未准备好,等待1秒后重试while not pipStop:# 检查管道中是否有数据read_bytes, bytes_avail, _ = win32pipe.PeekNamedPipe(hPipe, 0)buffer = b''if bytes_avail > 0:# 读取管道中的数据data = win32file.ReadFile(hPipe, bytes_avail, None)[1]buffer += data#  print(buffer[0])# 检查是否接收到特定数据if buffer == b'1\0':print("Python接收C++数据成功")# 发送响应数据win32file.WriteFile(hPipe, b'2\0', None)elif buffer == b'0\0':print("Python接收到关闭信号")win32file.WriteFile(hPipe, b'0\0', None)win32file.CloseHandle(hPipe)pipStop = Trueelse:# 管道中无数据,短暂休眠以避免过度CPU使用time.sleep(0.025)return True
  1. 最后,在需要使用时在c++端先调用函数,再调用python端的函数,便可通过命名管道进行不同语言、进程间的通信进行数据交换

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

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

相关文章

HTTP/1.1、HTTP/2、HTTP/3 演变(计算机网络)

HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f; HTTP/1.1 相比 HTTP/1.0 性能上的改进&#xff1a; 使用长连接改善了短连接造成的性能开销。支持管道网络传输&#xff0c;只要第一个请求发出去了&#xff0c;不必等其回来&#xff0c;就可以发第二个请求出去&#xff0c…

0基础学习Mybatis系列数据库操作框架——最小Demo

大纲 数据库Mybatis目录结构配置代码 代码/配置结构配置结构依赖库配置SQL配置Mybatis配置数据库配置SQL映射配置 完整配置 代码结构映射类Mybatis逻辑从 XML 中构建 SqlSessionFactory从 SqlSessionFactory 中获取 SqlSession通过mapper中的namespace和id执行SQL 完整逻辑和代…

nginx的https与动态负载均衡

nginx的https 证书可以根据你的域名和服务器服务商去进行签发 , 比如 : 阿里云 腾讯云 百度云 华为云等 这里使用的是腾讯云 : 下载证书 : 选择 nginx: 下载之后传递到服务器上。 下面开始配置nginx的https: 1. 解压下载的证书包 cd /etc/ssl unzip xxcc.dwa_nginx.zip mv…

2024/3/31学习总结

才不是今天没有学大知识才学这个。等我下周我发个大的。最近在读mysql的innodb底层&#xff0c;到时候给大家总结大的用自己的话&#xff0c;应该是缓慢更新吧 一、上午 1.1 icpc西部赛 酣畅淋漓的环节。主办方没有活硬整&#xff0c;就a,c,d,h可以做。a&#xff0c;h还题目意…

基于知识图谱的个性化学习推荐系统的设计与实现(论文+源码)_kaic

摘 要 Abstract 1 绪 论 1.1 研究背景及意义 1.2 国内外现状研究 1.3 研究工作和论文结构 2 相关技术 2.1 HTML 语言 2.2 Python 语言 2.3 数据库技术 2.4 Django 框架 3 系统分析 3.1 需求概述 3.2 系统可行性分析 3.2.1 技术可行性 3.2.2 经济可行性 3.2.3 操作可行性 3.3 功…

Spring-事务管理

1、事务管理 1.1、回滚方式 默认回滚方式&#xff1a;发生运行异常时异常和error时回滚&#xff0c;发生受查(编译&#xff09;异常时提交。不过&#xff0c;对于受查异常&#xff0c;程序员也可以手工设置其回滚方式 1.2、事务定义接口 1.2.1、事务隔离级别常量 这些常量…

EXCEL-VB编程实现自动抓取多工作簿多工作表中的单元格数据

一、VB编程基础 1、 EXCEL文件启动宏设置 文件-选项-信任中心-信任中心设置-宏设置-启用所有宏 汇总文件保存必须以宏启动工作簿格式类型进行保存 2、 VB编程界面与入门 参考收藏 https://blog.csdn.net/O_MMMM_O/article/details/107260402?spm1001.2014.3001.5506 二、…

HarmonyOS实战开发-slider组件的使用

介绍 本篇Codelab主要介绍slider滑动条组件的使用。如图所示拖动对应滑动条调节风车的旋转速度以及缩放比例。 相关概念 slider组件&#xff1a;滑动条组件&#xff0c;通常用于快速调节设置值&#xff0c;如音量调节、亮度调节等应用场景。 环境搭建 软件要求 DevEco Stu…

图像处理_积分图

目录 1. 积分图算法介绍 2. 基本原理 2.1 构建积分图 2.2 使用积分图 3. 举个例子 1. 积分图算法介绍 积分图算法是图像处理中的经典算法之一&#xff0c;由Crow在1984年首次提出&#xff0c;它是为了在多尺度透视投影中提高渲染速度。 积分图算法是一种快速计算图像区域和…

基于Python实现多功能翻译助手(上)

创建一个支持多种语言翻译并且允许通过文件拖拽来输入文本的Python窗口应用程序是一个相对复杂的任务&#xff0c;涉及到多个库和组件。以下是一个简化的指南&#xff0c;展示如何使用Python的Tkinter库创建GUI窗口&#xff0c;结合Googletrans库进行翻译&#xff0c;以及使用P…

jvm类加载机制概述

、什么是jvm的类加载机制 类加载机制是指我们将类的字节码文件所包含的数据读入内存&#xff0c;同时我们会生成数据的访问入口的一种 特殊机制。那么我们可以得知&#xff0c;类加载的最终产品是数据访问入口。 加载类文件&#xff08;即.class文件&#xff09;的方式有以下几…

处理 Oracle 数据库表空间满的问题

处理 Oracle 数据库表空间满的问题 1、诊断表空间满的问题2、处理表空间满的问题3、设置表空间自增结论 在 Oracle 数据库管理中&#xff0c;表空间是一个重要的概念&#xff0c;用于存储数据库对象和数据。当表空间满了时&#xff0c;可能会导致数据库的运行受到影响&#xff…

Mac 下安装maven教程

note&#xff1a;网上已经有很多该类型教程了&#xff0c;这边自身保留一份&#xff0c;方便后面使用&#xff1b; 一、安装地址&#xff1a;官网 二、安装步骤 $ tar -xvf apache-maven-3.3.9-bin.tar.gz //mac支持手动点击解压 $ sudo mv -f apache-maven-3.3.9 /usr…

服务器固定IP(固定出口IP)去访问外部服务

背景 服务器上有多个IP&#xff0c;那么在服务器请求外部服务的时候&#xff0c;到底是使用哪个IP呢&#xff1f;如果要使用特定的IP去请求外部服务&#xff0c;该如何设置呢&#xff1f; 分析 遇到一个实际的场景&#xff1a; 我们产品和其他产品联调&#xff0c;我们的服务…

PCL 计算线段之间的距离(3D)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里我们设第一个线段的端点为 P 0 P_0 P

Linux中断管理:(一)中断号的映射

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 中断控制器 Linux 内核支持众多…

规划控制如何兼顾安全与舒适性

规划控制如何兼顾安全与舒适性 附赠自动驾驶学习资料和量产经验&#xff1a;链接 **导读&#xff1a;**自动驾驶技术研发对于“安全第一”的追求是毋庸置疑的&#xff0c;但是这中间可能就忽视了舒适性。 因此&#xff0c;今天我想给大家分享的是&#xff0c;自动驾驶研发如何…

《Java面试自救指南》(专题一)操作系统

文章目录 力推操作系统的三门神课操作系统的作用和功能线程、进程和协程的区别并行与并发的区别什么是文件描述符操作系统内核态和用户态的区别用户态切换到内核态的方式大内核和微内核的区别用户级线程和内核级线程的区别线程的七态模型进程调度算法有哪些进程间通信的七种方式…

算法练习----力扣每日一题------3

原题链接 331. 验证二叉树的前序序列化 - 力扣&#xff08;LeetCode&#xff09; 题目解析 给一个字符串,判断它是否是一个二叉树的前序遍历.不同元素由逗号隔开,空节点用#字符代替. 递归解法 先假设每个元素都由一个字符构成(这样可以先不考虑烦人的多个字符情况) 在接口中调…

zookeeper如何管理客户端与服务端之间的链接?(zookeeper sessions)

zookeeper客户端与服务端之间的链接用zookeeper session表示。 zookeeper session有三个状态&#xff1a; CONNECTING, ASSOCIATING, CONNECTED, CONNECTEDREADONLY, CLOSED, AUTH_FAILED, NOT_CONNECTED&#xff08;start时的状态&#xff09; 1、CONNECTING 。 表明客户…