逐个读取QProcess中多次写入的输出

时间:2014-03-28 06:01:07

标签: qt qprocess

任何人都可以帮助我在写入和循环之后读取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();

预期输出必须是
&#34; OK&#34;
&#34;扫描结果&#34;

但是输出是
&#34; OK&#34;
&#34;&#34;

感谢。

1 个答案:

答案 0 :(得分:0)

您的多次等待对任何事情都没有用。所有你关心的是这个过程何时结束,所以只需要一次waitForFinished次呼叫,超时时间更长(这些扫描不会发生在~100ms内,几秒钟是最好的)。

您不应该使用阻止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方法/槽。这就是全部。