qt使用QProcess实现进程通信

77 篇文章 0 订阅

目录

要点

父进程发向子进程:

父进程一侧

子进程一侧

子进程发向父进程:

子进程一侧

父进程一侧

代码

父进程代码:

子进程代码:

效果


本文介绍在linux下实现父子进程通信的方法。完整项目见我的资源qt使用QProcess实现父子进程通信,适用linux平台-C++文档类资源-CSDN下载

要点

父进程发向子进程:

父进程一侧

QProcess::write发出信息

子进程一侧

父进程发来的信息进入stdin。在linux环境下,stdin ==0

子进程用QFile接收stdin的信息。当QFile接到信息时,通过QSocketNotifier自动发出信号activated

程序员应在子进程中设置一个槽函数响应activated。槽函数中调用read()函数从stdin中获取数据。注意,根据QProcess实现进程通信_东方忘忧的博客-CSDN博客_qprocess进程间通信的说法:

子进程读取信息不能通过QFile的readline等接口读取父进程信息,因为QFile他会读取标准输入的所有信息,并且不到长度就没有返回。哪怕QFile设置了读取长度,也会在满足长度后才有消息返回,我也不知为啥会这样。所有需要通过unistd.h的read接口来读取标准输入。

子进程发向父进程:

子进程发出的信息应通过stdout进入主进程,在linux下,stdout=1

子进程一侧

将QFile与stdout结合在一起,通过QFile::write向stdout写入信息。但我估计直接用unistd.h的write接口也可以。

父进程一侧

QProcess自动发出readyRead信号。程序员应设计一个槽函数与该信号关联。在这个槽函数里面调用QProcess::readAllStandardOutput获取信息。

代码

父进程代码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QProcess>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QProcess        *       m_pProc;
private slots:
    void                    OnFinish(int);
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent), m_pProc(nullptr),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_pProc = new QProcess();
    connect(ui->BtnSend, &QPushButton::clicked, [this](){
        if(m_pProc && m_pProc->isOpen())
        {
            QString qstrSend = ui->lineEdit->text();
            m_pProc->write(qstrSend.toUtf8());
        }
    });
    connect(m_pProc, &QProcess::readyRead, [this](){
        QString qstr(m_pProc->readAllStandardOutput());
        ui->label->setText(qstr);
    });
    connect(m_pProc, SIGNAL(finished(int)), this, SLOT(OnFinish(int)));

    m_pProc->start("./subProc");
    setWindowTitle("Main");
}

MainWindow::~MainWindow()
{
    if(m_pProc)
        delete m_pProc;
    delete ui;
}

void MainWindow::OnFinish(int)
{
    delete m_pProc;
    m_pProc = nullptr;
}

子进程代码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFile>
#include <QSocketNotifier>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    QFile               m_file;
    QSocketNotifier *   m_pNotifier;
    Ui::MainWindow  *   ui;
    char                m_arrRecv[128];
private slots:
    void            OnRead(int);
    void            OnSend(void);
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <unistd.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_file.open(0, QFile::WriteOnly);//0=stdin
    m_pNotifier = new QSocketNotifier(m_file.handle(), QSocketNotifier::Read, this);
    connect(m_pNotifier, SIGNAL(activated(int)), this, SLOT(OnRead(int)));
    connect(ui->BtnSend, &QPushButton::clicked, this, &MainWindow::OnSend);
    setWindowTitle("sub");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::OnRead(int iHandle)
{
    if(m_file.handle() == iHandle)
    {
        int iRet = read(m_file.handle(), m_arrRecv, sizeof(m_arrRecv));
        m_arrRecv[iRet] = 0;
        ui->label->setText(QString("%1").arg(m_arrRecv));
    }
}

void MainWindow::OnSend(void)
{
    QFile file;
    file.open(1, QFile::WriteOnly);//1==stdout
    file.write(ui->lineEdit->text().toUtf8());
    file.close();
}

效果

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值