qt子进程和父进程读写数据通信

2023-11-09

进程A(例如主程序)创建了一个进程 B,这个B就称为A的子进程,而A称为B的父进程。

这也称为进程间通信,有多种方式:

  1. TCP/IP
  2. Local Server/Socket
  3. 共享内存
  4. D-Bus (Unix库)
  5. QProcess
  6. 会话管理

这里,因为qt中一般是采用 QProcess创建的子进程,所以,接下来讲解的是该通信方式。

关于父进程读写子进程的数据,主要是用到:

父进程接收到了子进程数据,两个信号会发射出来:
void readyReadStandardError()
void readyReadStandardOutput()

两个功能函数:
QByteArray QProcess::readAllStandardError()
QByteArray QProcess::readAllStandardOutput()

QProcess::write()发出信息

这个资料就太多了,可以读我下面博客:

关于QProcess的使用问题解释_我是标同学的博客-CSDN博客

qt qprocess获取控制台输出(注意踩坑)_qprocess获取输出_我是标同学的博客-CSDN博客

QProcess用cmd运行其它进程_我是标同学的博客-CSDN博客

QT打开外部程序并嵌入Qt子窗口的缺点_qt嵌入外部窗口_我是标同学的博客-CSDN博客

qt启动cmd再启动一个exe_qt调用可执行程序exe_我是标同学的博客-CSDN博客

关于子进程读写父进程的数据,主要是用到:

  • Windows中:需要开启一个线程来管理stdin的文件变化,这个需要使用Windows API函数
  • linux中:使用QSocketNotifier 监听 stdin文件,当改文件有变化是,读取信息

windows平台:采用win的api,阻塞式的读取:

ReadFile(hStdinDup,chbuf,sizeof(chbuf),&dwRead,NULL);//读取hstdinDup句柄文件中的数据

这个是阻塞函数,类似控制台程序中的cin >> data,或者gets()。

因此需要开启一个线程来管理stdin的文件变化(函数中有涉及到while阻塞,一直检测标准输入通道stdin是否有可读取的信息,因此另开线程),在pro文件中添加:QT +=concurrent实例代码如下:

QFuture<void> fu=QtConcurrent::run(this,&Widget::readStdin);//开启一个线程

void Widget::readStdin()//读取数据
{
    bool ok=true;
    char chbuf[1024];//缓存
    DWORD dwRead;//32位无符号整数
    HANDLE hStdinDup;//HANDLE 句柄类型
 
    const HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);//GetStdHandle获取标准输入的句柄
    if(hStdin==INVALID_HANDLE_VALUE)//为无效句柄的话
        return;
    DuplicateHandle(GetCurrentProcess(),hStdin,
                    GetCurrentProcess(),&hStdinDup,0,false,DUPLICATE_SAME_ACCESS);//创建一个新句柄
    CloseHandle(hStdin);//关闭旧句柄
    while(ok)
    {
        ok=ReadFile(hStdinDup,chbuf,sizeof(chbuf),&dwRead,NULL);//读取hstdinDup句柄文件中的数据
        emit sig_log(QLatin1String("ok is:")+QString::number(ok));
        if(ok &&dwRead!=0)
        {
            emit sig_receivedCommand(QString::fromUtf8(chbuf,dwRead));//读取数据
        }
    }
 
}

linux平台:QFile来读取标准输入

QProcess子进程通过QFile来读取标准输入来接收父进程信息。通过QFile绑定QSocketNotifier来接收标准输入的实时信号,因为QSocketNotifier的activated信号可以通过标准输入是否有消息实时触发。

QProcess子进程通过QFile绑定标准输出stdout来发送消息给父进程。
注意:子进程读取信息不能通过QFile的readline等接口读取父进程信息,因为QFile他会读取标准输入的所有信息,并且不到长度就没有返回。哪怕QFile设置了读取长度,也会在满足长度后才有消息返回,我也不知为啥会这样。所有需要通过unstd.h的read接口来读取标准输入(Linux中才有的函数)。

    m_file.open(stdin, QFile::ReadOnly); //stdin=0
    if (m_file.isOpen())
    {
        m_clientsocket = new QSocketNotifier(m_file.handle(), QSocketNotifier::Read,this);
        connect(m_clientsocket,SIGNAL(activated(int)),this,SLOT(slotreaddata(int)));
    }

void MainWindow::slotreaddata(int fd)
{
    if(fd != m_file.handle() )
    return;

    char buf[128] = {0};
    read(fd,buf,sizeof(buf));     //不建议使用m_file.readLine(5)来读取返回值,而是unistd.h的read接口来读取标准输入(Linux中才有的函数)。
    m_readedit->append(QString::fromUtf8("接收消息:%1").arg(buf));

}
 

参考博客:

Qt 进程间通信_qt进程间通信_旷工锁的博客-CSDN博客

qt使用QProcess实现进程通信_qprocess父子进程_金色熊族的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt子进程和父进程读写数据通信 的相关文章

  • QGroupBox边框

    经过一段时间的搜索后 我发现在组框上设置可见边框的方法是使用 StyleSheet 属性 我补充道 border 2px solid gray 但有几个问题 1 组框内的所有内容也继承此设置 2 边框在标题附近有一个小洞 碎片缺失 Here
  • Qt 信号槽,新符号中的转换类型[重复]

    这个问题在这里已经有答案了 鉴于以下两个 connect ui gt comboBox SIGNAL activated QString ps SLOT requestPlotsAvailable QString connect ui gt
  • 如何在 QTableWidget 的行和列中自动换行文本?

    I tried QTableWidget j new QTableWidget 10000 5 centralWidget j gt setColumnWidth 0 500 j gt setColumnWidth 1 30 j gt se
  • 在哪里可以找到 Qt 的 dll 的 pdb 文件?

    我正在调试 Qt 应用程序 在哪里可以找到 Qt 的调试 dll 我在windows上使用的是vs2010 它说它需要 Qt 中的许多 dll 的 pdb 文件 从 Qt 5 9 开始 与 Windows 发行版相对应的 PDB 可作为单独
  • 我的 QSqlQueryModel 不在列表视图中显示数据

    我正在玩 QSqlQueryModel 但我现在完全陷入困境 我一整天都在寻找解决方案 但到目前为止还没有运气 我所做的工作是它从我的 sqlite 数据库中提取数据 但由于某种原因我无法在列表视图中显示它 我的角色名似乎不存在 对于我从数
  • cx_freeze:QODBC 驱动程序未加载

    我的 python 应用程序如下所示 test py from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4 import QtSql import sys import at
  • [本机]:在Qt for Android中使用Java函数和第3方库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近我用qt写了一个android应用程序 但我有一个很大的问题 我可以使用 调用一些原生的android API 比如调用特殊的activit
  • Qt GUI 编程设计

    我正在尝试创建一个 GUI 应用程序 主窗口 一个QMainWindow 包含 9 个固定大小的标签以及主窗口的大小 我尝试在没有 Qt GUI Designer 的情况下以编程方式制作它 该项目构建时没有错误 但我看不到主窗口上显示的任何
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • MAC 上的 QT/C++ - 未设置应用程序图标

    我正在努力解决的奇怪问题 在与我的 pro QT 项目文件相同的文件夹中 我有一个 Resources myIcon png 我试图将其设置为我构建的应用程序的图标 在 OSX 上运行 我阅读了文档 它建议在 pro 文件中添加 ICON
  • 仅将非模态 QDialog 窗口放置在我的应用程序顶部,而不是所有应用程序顶部

    我有一个 QDialog 窗口 它应该始终位于我的应用程序顶部 它不是模态的 用户可以随时与对话框和主应用程序进行交互 使用窗口保持在顶部提示在某种程度上实现了这一点 但是 该对话框仍然位于所有其他正在运行的应用程序 例如记事本 chrom
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • 如何使用 Qtimer 添加 1 秒延迟

    我目前有一个方法如下 void SomeMethod int a Delay for one sec timer gt start 1000 After one sec SomeOtherFunction a 这个方法实际上是一个附加到信号
  • Qt 文件对话框默认后缀不起作用

    我将以下代码用于 QtQuick Dialogs 1 3 和 Qt 5 10 0 下 filedialog 的新属性 我使用 Qt Creator 5 10 默认套件构建它 import QtQuick 2 10 import QtQuic
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • 如何使QTableView类的restoreState()和saveState()正常工作?

    首先 我想说 我的问题已经在这里讨论过 并且这里是 https stackoverflow com questions 1163030 qt qtableview and horizontalheader restorestate 但答案并

随机推荐

  • comsol学习中心:几何建模

    创建二维几何 我们打算创建这样的二维模型 这里演示创建 因此不考虑物理场等的设置 创建空白模型 创建的是二维几何 所以在组件中选择天剑二维组件 也可以通过在功能树上右键进行此操作 接着在几何选项卡下找到体素开始构建几何 先添加一个圆形 在功
  • mybaits如何防止SQL注入:mybatis的${}和#{}

    其实这个mybatis的 和 区别和使用 算是很古早很常见的一个基础问题了 先说结论 尽可能使用 不使用 因为 可以防止SQL注入 如果记不清楚 就记一句话或者是口诀 不是所有事都能靠钱能解决 号是货币符号 为什么 可以防止SQL注入 占位
  • Source Insight设置黑色背景

    今天使用Source Insight看C代码 觉得背景白色太亮 觉得应该可以调背景颜色 通过百度 搜索到了CSDN上的相关文章 受益良多 但是文章后面附的style文件下载需30积分 无奈囊中羞涩 只好自己按照文章的说明调颜色 首先将背景调
  • 【基于python实现UI自动化】4.1 selenium发送163邮箱邮件

    python UI自动化 1 0 selenium工具介绍 2 0 selenium环境搭建 3 Selenium的元素定位 3 0 selenium常见8大元素定位 3 1 selenium通过By定位元素 3 2 selenium通过J
  • MySQL出现:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)问题解决

    本文mysql的安装环境为win7 64位 mysql版本为MySQL5 7 问题描述 在命令行输入 mysql u root p 登录mysql 返回 Can t connect to MySQL server on localhost
  • 【不忘初心】Windows11 22000.168 X64 四合一[纯净精简版][2.77G](2021.8.29)

    此版可正常更新补丁 WIN11全新的UI界面出炉 可以说这一次Windows 11全新升级 无论是从Logo上还是UI界面设计 都有很大的变化 母版来自UUP WIN11 22000 168 为了保证稳定初心的系统全部都是离线精简和优化 非
  • MySQL常用配置详解

    目录 一 MySQL 查看配置信息 二 MySQL 查看服务器当前运行状态的信息 三 MySQL 常用配置详解 1 mysql 使用mysql命令登录数据库时的默认的设置 2 client 客户端默认设置内容 3 mysqld 服务端端配置
  • centos 6.4/redhat 6.4 安装gitlab

    为什么80 的码农都做不了架构师 gt gt gt 一 把所有包升级到最新版本 yum y upgrade 二 安装最新版ruby 2 1 5 步骤http my oschina net duolus blog 348353 三 安装官方给
  • MATLAB对RGB彩色图像进行加马赛克处理

    简单实现MATLAB对RGB彩色图像进行加马赛克处理 为了加深对图像中像素块操作的记忆 利用像素块内均值方式对RGB彩色图像进行马赛克效果的处理 为了能后比较简单得实现 所以采用了n n像素块大小的均值的方式 为了比较简单实现 这里对RGB
  • 简单算法之矩阵运算

    不多说上代码 矩阵对象 class Matrix 矩阵的宽度 private final int width 矩阵的高度 private final int height 矩阵 private final int arr Matrix in
  • 如何创建微信小程序并实现快速变现?

    工作之余做点副业增进一下自己的收入是每个技术从业人员甚至是非技术人员都很喜欢的事情 即所谓的 睡后收入 疫情几年没时间或者说没有精力 随着疫情结束 经济的急速上升 谁不想赶快充实一下自己腰包 微信小程序毋容置疑是比较好的一种方式 做好的微信
  • 语音中的响度,音调与音色的决定因素

    目录 一 先验知识 1 基波与谐波 2 基音与泛音 二 图解泛音的形成原理 生动形象的视频介绍 三 图解泛音决定音色 写在前面 响度由声源的振幅决定 音调由基波的频率决定 音色由泛音决定 一 先验知识 1 基波与谐波 基波是原合成的周期信号
  • 毕业设计-基于机器视觉的室内智能安防车系统 -STM32和 OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 系统整体设计 二 智能安防车硬件系统设计 三 室内安防车自动巡逻机制的实现 四 基于 OpenCV 图像识别的火焰识别 五 分类器设计及软件实现 代码部分 实现效果图样例 最后 前言 大四是整个
  • 主成分分析法确定权重

    在数模中 确定权重方法有很多种 比如主成分分析法 层次分析法 熵权法 相关系数作为权重等 网上很多教程都是用spss计算权重 这里主要讲利用python通过主成分分析法确定权重 主成分分析法概述 主成分分析法是一种线性的降维算法 通过将N维
  • 黑莓QNX选定由延锋伟世通数字仪表项目

    锋影 e mail 174176320 qq com 黑莓有限公司宣布延锋伟世通 全球1级汽车零部件供应商 已经选择该公司的安全认证QNX平台仪器集群1一个数字仪表项目与中国的一个主要的OEM软件 该交易的条款是保密的 黑莓的QNX技术已为
  • istio安装实践

    启动minikube istio的实验环境部署在minikube上 首先启动minikube minikube安装参考上一博客 minikube start vm driver kvm2 extra config controller ma
  • 提高C++性能的编程技术笔记:引用计数+测试代码

    引用计数 reference counting 基本思想是将销毁对象的职责从客户端代码转移到对象本身 对象跟踪记录自身当前被引用的数目 在引用计数达到零时自行销毁 换句话说 对象不再被使用时自行销毁 引用计数和执行速度之间的关系是与上下文紧
  • 基于STM32实现MQTT

    最近一个项目中要用到MQTT或者CoAP 比较了两个的优缺点后 最后选择了MQTT 由于是第一次接触这个协议 在学习中遇到了不少的坑 所以分享出来 第一次写博客 有错勿怪 1 MQTT协议 MQTT Message Queuing Tele
  • springboot项目安装SSL证书实现HTTPS访问,以若依框架为例

    首先下载证书 网上有很多免费的 也可以自己购买并域名然后会对应提供证书 以腾讯云为例 下载下来的解压后如图 项目里我们操作有 1 在resource中新建cert文件 并将证书中的Tomcat文件夹中的两个文件导入到cert文件夹中 2 在
  • qt子进程和父进程读写数据通信

    进程A 例如主程序 创建了一个进程 B 这个B就称为A的子进程 而A称为B的父进程 这也称为进程间通信 有多种方式 TCP IP Local Server Socket 共享内存 D Bus Unix库 QProcess 会话管理 这里 因