对于QProcess,是否需要在waitForFinished之后调用waitForReadyRead

With QProcess, Is it necessary to call waitForReadyRead after waitForFinished?

本文关键字:waitForFinished 之后 调用 waitForReadyRead QProcess 是否 对于      更新时间:2023-10-16

我使用下面的代码从命令行实用程序的标准输出中获取"帮助"。直到今天早上有人遇到问题(出现的消息框表明该命令看起来很奇怪),这段代码一直没有出现问题。

我似乎无法重现这个问题,所以我将其归因于系统异常,因为该实用程序位于网络共享驱动器上,而我们的系统承受着安全过程的负担,这会导致很多滞后。

添加waitForReadyRead检查是有益的,还是多余的?

如有任何想法或建议,我们将不胜感激。

QProcess cmd_process;
cmd_process.setWorkingDirectory("x:/working/directory");
cmd_process.start(R"(t:binwincmdlineutility.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");
}

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

  • 调用

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

  • 完成后,调用

    drainOutputPipes()

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