c – Qt 5和QProcess使用signalslot readyRead重定向stdout

c – Qt 5和QProcess使用signalslot readyRead重定向stdout,第1张

概述这个问题困扰我,因为它应该工作,但遗憾的是它没有. 我试图实现的是读取某个过程的标准输出并使另一个过程处理它,即打印出来. 生成输出的过程如下所示: #include <stdio.h>#include <stdlib.h>#include <iostream>int main() { for (int i = 0; i < 100; i++) { printf(" 这个问题困扰我,因为它应该工作,但遗憾的是它没有.
我试图实现的是读取某个过程的标准输出并使另一个过程处理它,即打印出来.

生成输出的过程如下所示:

#include <stdio.h>#include <stdlib.h>#include <iostream>int main() {    for (int i = 0; i < 100; i++) {        printf("yes %d\n",i);        fflush(stdout);        sleep(1);    }    return 0;}

该过程在另一个应用程序中启动,如下所示:

#include <QProcess>...QProcess * process = new QProcess;SomeClass * someClass = new SomeClass(process);connect(process,SIGNAL(readyRead()),someClass,SLOT(onReadyRead()));process->start("../Test/Test",QStringList());if (!process->waitForStarted(4000)) {    qDeBUG() << "Process dID not start.";}...voID SomeClass::onReadyRead() {    qDeBUG() << "Reading:" << process->readAllStdOutput();}

我的预期输出是:

Reading: yes 0Reading: yes 1...Reading: yes 99

但是我根本没有输出.
当我使用QCoreApplication时,我得到所有输出,但不是通过信号/插槽,而是直接在控制台中.

我不明白,因为它适用于使用Qt 4.8的另一个应用程序.

我的问题是,是否有人遇到同样的问题或有谁知道我如何能得到预期的行为?

解决方法 您提供的答案中的问题在于误解了阅读的工作原理.它只返回你在那里得到的任何数据,无论是否有行结尾.通过生成一个线程并在线之间休眠,您可以有效地以行大小的块发送进程间数据,因为当您等待足够长时间时会刷新管道.

所以,你的答案,在工作时,并不是真的应该怎么做.您需要使用readline()将传入的数据切割成行.以下是具有以下品质的示例:

>只有一个可执行文件:)
>仅使用Qt APIs.这减少了运行时内存消耗.
>两个进程都干净地终止.
>代码量尽可能小.

// https://github.com/KubaO/stackoverflown/tree/master/questions/process-17856897#include <QtCore>QTextStream out{stdout};class Slave : public QObject {    QBasicTimer m_timer;    int m_iter = 0;    voID timerEvent(QTimerEvent * ev) overrIDe {        if (ev->timerID() == m_timer.timerID()) {            out << "iteration " << m_iter++ << endl;            if (m_iter > 35) qApp->quit();        }    }public:    Slave(QObject *parent = nullptr) : QObject(parent) {        m_timer.start(100,this);    }};class Master : public QObject {    Q_OBJECT    QProcess m_proc{this};    Q_SLOT voID read() {        while (m_proc.canReadline()) {            out << "read: " << m_proc.readline();            out.flush(); // endl implicitly flushes,so we must do the same        }    }    Q_SLOT voID started() {        out << "started" << endl;    }    Q_SLOT voID finished() {        out << "finished" << endl;        qApp->quit();    }public:    Master(QObject *parent = nullptr) : QObject(parent) {        connect(&m_proc,SLOT(read()));        connect(&m_proc,SIGNAL(started()),SLOT(started()));        connect(&m_proc,SIGNAL(finished(int)),SLOT(finished()));        m_proc.start(qApp->applicationfilePath(),{"dummy"});    }};int main(int argc,char *argv[]){    QCoreApplication app{argc,argv};    if (app.arguments().length() > 1)        new Slave{&app}; // called with an argument,this is the slave process    else        new Master{&app}; // no arguments,this is the master    return app.exec();}#include "main.moc"
总结

以上是内存溢出为你收集整理的c – Qt 5和QProcess使用signal / slot readyRead重定向stdout全部内容,希望文章能够帮你解决c – Qt 5和QProcess使用signal / slot readyRead重定向stdout所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1226793.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存