gpt4 book ai didi

c++ - 为什么QProcess::readAllStandardOutput不读取所有输出 channel ?

转载 作者:行者123 更新时间:2023-12-01 14:53:19 25 4
gpt4 key购买 nike

我想将顶级Linux工具的输出添加到QTextEdit。顶部的输出很大-可能是以下代码的原因:

m_pprocess = new QProcess();
m_pprocess->setCurrentWriteChannel(QProcess::StandardOutput);
m_pprocess->start("top -b -d 5.0");

connect(m_pprocess, &QProcess::readyReadStandardOutput, [this](){

m_ptexteditProcesses->clear();
QThread::msleep(1000);
QByteArray ba = m_pprocess->readAllStandardOutput();
m_ptexteditProcesses->append(ba);
qDebug() << ba.size();
m_ptexteditProcesses->verticalScrollBar()->triggerAction(QScrollBar::SliderToMinimum);
});

表现如下:
  • 尽管顶部命令的更新时间为5秒,但我的
    QTextEdit两次更新,周期为1秒,并且等待3-4秒以进行下一次顶级更新。那就是为什么我添加QThread::msleep(1000);的原因-只是为了看到它在QTextEdit中闪烁
    并完全识别出数据写入(如果汇总全部
    5秒内的交易)。
  • qDebug()给我看下一张图片(第1个数字-> [1秒]->第2个数字-> [3秒]->第4个数字-> [1秒]-> ...):

  • QByteBuffer size

    好像 readAllStandardOutput();读取的不是全部标准输出,而是4096字节,然后才读取剩余的字节(大约14000,即没有读取缓冲区的限制)!

    因此,我无法在QTextEdit中显示top命令的全部输出:)请帮助我!

    更新:

    添加 m_pprocess->waitForReadyRead(1);可能无法解决,例如
    connect(m_pprocess, &QProcess::readyReadStandardOutput, [this](){

    m_ptexteditProcesses->clear();
    //QThread::msleep(1000);
    QByteArray ba;
    m_pprocess->waitForReadyRead(1);
    ba.append(m_pprocess->readAllStandardOutput());
    m_ptexteditProcesses->append(ba);
    qDebug() << ba.size();
    m_ptexteditProcesses->verticalScrollBar()->triggerAction(QScrollBar::SliderToMinimum);
    });

    并生产这个新的

    但是是否有更优雅的解决方案可以单步读取标准输出?

    最佳答案

    一种可能的解决方案是使“top”命令运行一次,并且当该命令读取完所有信息后,每隔T秒读取一次,则可以使用QTimer:

    m_pprocess = new QProcess();
    m_pprocess->setCurrentWriteChannel(QProcess::StandardOutput);
    m_pprocess->setProgram("top");
    m_pprocess->setArguments({"-bn1"});

    m_ptimer = new QTimer;
    m_ptimer->setSingleShot(true);
    m_ptimer->setInterval(5000);
    connect(m_ptimer, &QTimer::timeout, m_pprocess, [this]{
    m_pprocess->start();
    });

    connect(m_pprocess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [this](){
    m_ptexteditProcesses->clear();
    QByteArray ba = m_pprocess->readAllStandardOutput();
    m_ptexteditProcesses->append(ba);
    qDebug() << ba.size();
    m_ptexteditProcesses->verticalScrollBar()->triggerAction(QScrollBar::SliderToMinimum);
    m_ptimer->start();
    });

    m_pprocess->start();

    关于c++ - 为什么QProcess::readAllStandardOutput不读取所有输出 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60748080/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com