QProcess中多次写入的输出一一读取

Posted

技术标签:

【中文标题】QProcess中多次写入的输出一一读取【英文标题】:Read output of multiple write in QProcess one by one 【发布时间】:2014-03-28 06:01:06 【问题描述】:

谁能帮我在写入和循环之后读取 qprocess 的输出,直到所有任务完成? 我有这个代码

  wifi->write("scan\n");  
  wifi->closeWriteChannel();
  wifi->waitForBytesWritten(100);
  wifi->waitForReadyRead(100);
  wifi->waitForFinished(100);
  qDebug() << "read output" << wifi->readAllStandardOutput();
  wifi->write("scan\n");  
  wifi->closeWriteChannel();
  wifi->waitForBytesWritten(100);
  wifi->waitForReadyRead(100);
  wifi->waitForFinished(100);
  qDebug() << "read output" << wifi->readAllStandardOutput();

预期的输出必须是 “好的” “扫描结果”

但输出是 “好的” ""

谢谢。

【问题讨论】:

【参考方案1】:

您的多次等待对任何事情都没有用。您只关心进程何时完成,因此有一个具有更长超时时间的 waitForFinished 调用(这些扫描不会在大约 100 毫秒内发生,最少几秒钟)。

您不应该使用阻塞的waitForXxx 方法。他们绊倒了每个人,是无休止的悲伤之源。忘记它们的存在。使用进程的信号对发生的事件做出反应。

Qt 5 + C++11

这是前进的方向。这就是为什么你应该坚持使用现代开发环境,如果可以的话。输入更少,更容易理解。

void MyObject::startWifi() 
  auto process = new QProcess(this);
  process->start("program", QStringList() << "argument");
  connect(process, &QProcess::started, [process]
    process->write("scan\n");
    process->closeWriteChannel();
  );
  connect(process, &QProcess::finished, [process]
    qDebug() << process->readAllStandardOutput();
    process->deleteLater();
  );

Qt 4

class MyObject : public QObject 
  Q_OBJECT
  QProcess m_wifi;
  Q_SLOT void onStarted() 
    m_wifi.write("scan\n");
    m_wifi.closeWriteChannel();
  
  Q_SLOT void onFinished() 
    qDebug() << m_wifi.readAllStandardOutput();
  
public:
  MyObject(QObject * parent = 0) : QObject(parent) 
    connect(&m_wifi, SIGNAL(started()), SLOT(onStarted()));
    connect(&m_wifi, SIGNAL(finished(int,QProcess::ExitStatus)),
                     SLOT(onFinished()));
  
  Q_SLOT void start() 
    m_wifi.start("program", QStringList() << "argument");
  
;

然后在该对象的实例上调用start 方法/槽。就是这样。

【讨论】:

我的问题是我第二次使用 wifi->readAllStandardOutput();在 wifi->write("command");输出是“”

以上是关于QProcess中多次写入的输出一一读取的主要内容,如果未能解决你的问题,请参考以下文章

QProcess在启动多次后给出FailedToStart

如何读取 QProcess 输出

使用 QProcess 时无法读取命令的输出

使用 QProcess 读取标准输出

试图从生成的 QProcess 中读取标准输出

QProcess -> 在 Linux 上从 sftp 读取标准输出