关于QProcess进程间通信的问题

PGfans 2020-01-15 04:09:46

如图,主进程通过按钮唤醒了子进程。
问题出在了:在主进程的lineEdit输入内容,点击发送,子进程的lineEdit没有显示主进程发来的内容。
通过QProcess的write()和read()实现,write端已经成功返回正确值(sizeof(发送内容)),但read端一直返回0。
用QProcess进程通信的时候是需要设置ProcessChannelMode还是其他别的设置
...全文
542 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
弓人水 2020-03-11
  • 打赏
  • 举报
回复
引用 12 楼 PGfans 的回复:
[quote=引用 4 楼 弓人水 的回复:]
注意:stdin文件句柄在主线程有个问题,当管道内为空时会阻塞进程,所以建议最好新建一个线程,专门读取stdin的内容,然后通过信号通知主进程获取内容。

请问这个现象,是不是可以说明,qprocess通信的时候,父进程写一次,子进程也只能读一次,因为第二次读就为空了嘛。
另外还有个疑问,父进程可以和多个子进程通信吗[/quote]
1、子进程读为空的话,会阻塞子进程,直到主进程写入。
2、多个client不就是多个子进程通信了么。
PGfans 2020-03-10
  • 打赏
  • 举报
回复
引用 4 楼 弓人水 的回复:
注意:stdin文件句柄在主线程有个问题,当管道内为空时会阻塞进程,所以建议最好新建一个线程,专门读取stdin的内容,然后通过信号通知主进程获取内容。
请问这个现象,是不是可以说明,qprocess通信的时候,父进程写一次,子进程也只能读一次,因为第二次读就为空了嘛。 另外还有个疑问,父进程可以和多个子进程通信吗
PGfans 2020-02-25
  • 打赏
  • 举报
回复
引用 10 楼 弓人水 的回复:
[quote=引用 9 楼 PGfans 的回复:] [quote=引用 5 楼 弓人水 的回复:] server端:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_client(Q_NULLPTR)
{
    ui->setupUi(this);
}

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

void MainWindow::on_btn_WakeUp_clicked()
{
    if(m_client)
        return;

    m_client = new QProcess(this);
    m_client->start("../client/client.exe");
}

void MainWindow::on_btn_Send_clicked()
{
    if(!m_client)
        return;

    if(m_client->state() == QProcess::Running) {
        m_client->write(ui->txt_Message->text().toLocal8Bit() + "\n");
    }
}
client端:
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_stdin(new QFile(this))
{
    ui->setupUi(this);
    m_stdin->open(stdin, QIODevice::ReadOnly);
}

MainWindow::~MainWindow()
{
    delete ui;
    m_stdin->close();
}

void MainWindow::on_btn_Get_clicked()
{
    ui->txt_Message->setText(QString::fromLocal8Bit(m_stdin->readLine()));
}
请问 m_client(Q_NULLPTR) 在 .h 里怎么声明呀[/quote] QProcess *m_client;[/quote] 完美运行,感谢大佬! 作为qt新手我还有一个问题,能帮忙看一下嘛 https://bbs.csdn.net/topics/395942941
弓人水 2020-02-25
  • 打赏
  • 举报
回复
引用 9 楼 PGfans 的回复:
[quote=引用 5 楼 弓人水 的回复:]
server端:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, m_client(Q_NULLPTR)
{
ui->setupUi(this);
}

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

void MainWindow::on_btn_WakeUp_clicked()
{
if(m_client)
return;

m_client = new QProcess(this);
m_client->start("../client/client.exe");
}

void MainWindow::on_btn_Send_clicked()
{
if(!m_client)
return;

if(m_client->state() == QProcess::Running) {
m_client->write(ui->txt_Message->text().toLocal8Bit() + "\n");
}
}


client端:
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, m_stdin(new QFile(this))
{
ui->setupUi(this);
m_stdin->open(stdin, QIODevice::ReadOnly);
}

MainWindow::~MainWindow()
{
delete ui;
m_stdin->close();
}

void MainWindow::on_btn_Get_clicked()
{
ui->txt_Message->setText(QString::fromLocal8Bit(m_stdin->readLine()));
}


请问 m_client(Q_NULLPTR) 在 .h 里怎么声明呀[/quote]
QProcess *m_client;
PGfans 2020-02-25
  • 打赏
  • 举报
回复
引用 5 楼 弓人水 的回复:
server端:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_client(Q_NULLPTR)
{
    ui->setupUi(this);
}

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

void MainWindow::on_btn_WakeUp_clicked()
{
    if(m_client)
        return;

    m_client = new QProcess(this);
    m_client->start("../client/client.exe");
}

void MainWindow::on_btn_Send_clicked()
{
    if(!m_client)
        return;

    if(m_client->state() == QProcess::Running) {
        m_client->write(ui->txt_Message->text().toLocal8Bit() + "\n");
    }
}
client端:
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_stdin(new QFile(this))
{
    ui->setupUi(this);
    m_stdin->open(stdin, QIODevice::ReadOnly);
}

MainWindow::~MainWindow()
{
    delete ui;
    m_stdin->close();
}

void MainWindow::on_btn_Get_clicked()
{
    ui->txt_Message->setText(QString::fromLocal8Bit(m_stdin->readLine()));
}
请问 m_client(Q_NULLPTR) 在 .h 里怎么声明呀
swz5637 2020-01-17
  • 打赏
  • 举报
回复
引用 7 楼 弓人水 的回复:
[quote=引用 6 楼 swz5637 的回复:] [quote=引用 5 楼 弓人水 的回复:] server端:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_client(Q_NULLPTR)
{
    ui->setupUi(this);
}

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

void MainWindow::on_btn_WakeUp_clicked()
{
    if(m_client)
        return;

    m_client = new QProcess(this);
    m_client->start("../client/client.exe");
}

void MainWindow::on_btn_Send_clicked()
{
    if(!m_client)
        return;

    if(m_client->state() == QProcess::Running) {
        m_client->write(ui->txt_Message->text().toLocal8Bit() + "\n");
    }
}
client端:
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_stdin(new QFile(this))
{
    ui->setupUi(this);
    m_stdin->open(stdin, QIODevice::ReadOnly);
}

MainWindow::~MainWindow()
{
    delete ui;
    m_stdin->close();
}

void MainWindow::on_btn_Get_clicked()
{
    ui->txt_Message->setText(QString::fromLocal8Bit(m_stdin->readLine()));
}
大佬,你这个client端的m_stdin定义的是什么类型的变量。或者用什么类型的变量才能接收从server端传过来的数据。[/quote] 仔细看代码(m_stdin(new QFile(this)))就知道啦,肯定是QFile指针类型。[/quote] 是我看漏了。
弓人水 2020-01-17
  • 打赏
  • 举报
回复
引用 6 楼 swz5637 的回复:
[quote=引用 5 楼 弓人水 的回复:]
server端:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, m_client(Q_NULLPTR)
{
ui->setupUi(this);
}

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

void MainWindow::on_btn_WakeUp_clicked()
{
if(m_client)
return;

m_client = new QProcess(this);
m_client->start("../client/client.exe");
}

void MainWindow::on_btn_Send_clicked()
{
if(!m_client)
return;

if(m_client->state() == QProcess::Running) {
m_client->write(ui->txt_Message->text().toLocal8Bit() + "\n");
}
}


client端:
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, m_stdin(new QFile(this))
{
ui->setupUi(this);
m_stdin->open(stdin, QIODevice::ReadOnly);
}

MainWindow::~MainWindow()
{
delete ui;
m_stdin->close();
}

void MainWindow::on_btn_Get_clicked()
{
ui->txt_Message->setText(QString::fromLocal8Bit(m_stdin->readLine()));
}


大佬,你这个client端的m_stdin定义的是什么类型的变量。或者用什么类型的变量才能接收从server端传过来的数据。[/quote]
仔细看代码(m_stdin(new QFile(this)))就知道啦,肯定是QFile指针类型。
swz5637 2020-01-17
  • 打赏
  • 举报
回复
引用 5 楼 弓人水 的回复:
server端:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_client(Q_NULLPTR)
{
    ui->setupUi(this);
}

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

void MainWindow::on_btn_WakeUp_clicked()
{
    if(m_client)
        return;

    m_client = new QProcess(this);
    m_client->start("../client/client.exe");
}

void MainWindow::on_btn_Send_clicked()
{
    if(!m_client)
        return;

    if(m_client->state() == QProcess::Running) {
        m_client->write(ui->txt_Message->text().toLocal8Bit() + "\n");
    }
}
client端:
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_stdin(new QFile(this))
{
    ui->setupUi(this);
    m_stdin->open(stdin, QIODevice::ReadOnly);
}

MainWindow::~MainWindow()
{
    delete ui;
    m_stdin->close();
}

void MainWindow::on_btn_Get_clicked()
{
    ui->txt_Message->setText(QString::fromLocal8Bit(m_stdin->readLine()));
}
大佬,你这个client端的m_stdin定义的是什么类型的变量。或者用什么类型的变量才能接收从server端传过来的数据。
走好每一步 2020-01-16
  • 打赏
  • 举报
回复
自己弄CProcess, 进程间可以用socket通信
弓人水 2020-01-16
  • 打赏
  • 举报
回复
server端:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, m_client(Q_NULLPTR)
{
ui->setupUi(this);
}

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

void MainWindow::on_btn_WakeUp_clicked()
{
if(m_client)
return;

m_client = new QProcess(this);
m_client->start("../client/client.exe");
}

void MainWindow::on_btn_Send_clicked()
{
if(!m_client)
return;

if(m_client->state() == QProcess::Running) {
m_client->write(ui->txt_Message->text().toLocal8Bit() + "\n");
}
}


client端:
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, m_stdin(new QFile(this))
{
ui->setupUi(this);
m_stdin->open(stdin, QIODevice::ReadOnly);
}

MainWindow::~MainWindow()
{
delete ui;
m_stdin->close();
}

void MainWindow::on_btn_Get_clicked()
{
ui->txt_Message->setText(QString::fromLocal8Bit(m_stdin->readLine()));
}
弓人水 2020-01-16
  • 打赏
  • 举报
回复
注意:stdin文件句柄在主线程有个问题,当管道内为空时会阻塞进程,所以建议最好新建一个线程,专门读取stdin的内容,然后通过信号通知主进程获取内容。
弓人水 2020-01-16
  • 打赏
  • 举报
回复
QProcess的写入内容要以换行结尾,这样子进程才能从stdin获取:
//server:
clientProcess->write(ui->txt_Message->text().toUtf8() + "\n");


//client
m_stdin->open(stdin, QIODevice::ReadOnly);
....
QTextStream t(m_stdin);
ui->txt_Message->setText(t.readLine());
PGfans 2020-01-16
  • 打赏
  • 举报
回复
引用 1 楼 走好每一步 的回复:
自己弄CProcess, 进程间可以用socket通信
进程间我就是想尝试用qprocess,网上说所谓无名管道的原理,意思能理解,但不太会用

16,202

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧