使用QProcess,是否有必要在waitForFinished之后调用waitForReadyRead?

时间:2019-01-24 15:18:17

标签: c++ windows qt qprocess

我使用下面的代码从命令行实用程序的标准输出中捕获“帮助”。直到今天早上有人遇到问题时,该代码才能正常工作(出现消息框,表明命令看起来很奇怪)。

我似乎无法重现该问题,因此我将其归咎于系统异常,因为该实用程序位于网络共享驱动器上,并且我们的系统负担着安全流程,从而导致大量的滞后。

添加waitForReadyRead支票是否有益,还是多余?

任何想法或建议都会受到赞赏。

QProcess cmd_process;
cmd_process.setWorkingDirectory("x:/working/directory");
cmd_process.start(R"(t:\bin\win\cmdlineutility.exe)", QStringList() << "/help");
if(cmd_process.waitForFinished())
{
    // TODO - should waitForReadyRead() go here?
    QByteArray ba = cmd_process.readAll();
    if(ba.contains("something good"))
    {
        // do stuff here
    }
    else
    {
        QMessageBox::information(0, "Something wrong", "cmdlineutility looks odd");
    }
}
else
{
    QMessageBox::information(0, "something wrong", "total fail");
}

1 个答案:

答案 0 :(得分:1)

至少在qprocess_win.cppQProcessPrivate::waitForReadyRead(int msecs)QProcessPrivate::waitForFinished(int msecs) 执行相同的操作:

  • 通话

    stdoutChannel.reader && stdoutChannel.reader->waitForReadyRead(0)

  • ,完成后,调用

    drainOutputPipes()

因此,当waitForFinished()返回时,所有可用数据都将被读入输出缓冲区。