QProcess精加工的可靠检测

Posted

技术标签:

【中文标题】QProcess精加工的可靠检测【英文标题】:Reliable detection of QProcess finishing 【发布时间】:2017-12-13 07:10:34 【问题描述】:

我有一个 Windows Qt 应用程序,它使用 QProcess 运行可能需要也可能不需要输入的外部程序。如果需要,输入将始终y,后跟ENTER。而且,如果输入y,程序会立即退出。

所以我在代码中采取的行动是:

QProcess process;
QString cmd = QString("myprog.exe %1").arg(myParam);

process.start(cmd);
if (! process.waitForStarted(10000))

    logError("Timed out starting preparation!");
    return;

process.write("y\n");
if (! process.waitForFinished(5000))

    process.kill();
    process.waitForFinished(5000);
    logError("Timed out finishing preparation!");
    return;

现在我经常会看到最终的错误消息尽管该过程似乎工作正常(在事件发生后可以检测到输入y,所以我知道它正在发生)。这是间歇性的。

调查让我找到了 Qt QProcess doco,它有这个宝石:

bool QProcess::waitForFinished(int msecs = 30000)

阻塞直到进程完成并发出finished() 信号,或者直到msecs 毫秒过去。

如果进程完成则返回true;否则返回false(如果操作超时,如果发生错误,或者如果这个QProcess已经完成)。

怀疑可能是最后一句话在咬我。因为一旦你输入y,进程就会退出,我认为当我到达第一次调用WaitForFinished() 时它不再存在。所以该函数将返回 false,我会假设它不能正常工作。

所以我有两个基于此的问题。首先,我的理解正确吗?是否有可能在检查之前进程已经退出并且会导致错误的返回值。

其次,如果,你如何区分在你检查之前已经退出的进程和在你的超时开始之前没有退出的进程之间的区别?

【问题讨论】:

如source code 中所见,它检查进程状态是否为QProcess::NotRunning,如果是则返回false。您可以在致电 QProcess::waitForFinished 之前自行检查。 【参考方案1】:

当你调用waitForFinished()时认为进程已经关闭时,你应该检查进程是否正在运行。

process.write("y\n");
process.waitForFinished(5000)
if(process.state() != QProcess::NotRunning)
 
  ..

【讨论】:

以上是关于QProcess精加工的可靠检测的主要内容,如果未能解决你的问题,请参考以下文章

如何确定在 Linux 上使用 Qt4 终止 QProcess 的信号?

QT4:为啥 bash shell 比使用 QProcess 调用的相同脚本更快?

在 Qt 中获取输出:'QProcess::start()' 和 'QProcess:readAllStandardOutPut()'

如何在 QProcess 执行它们时打印真正的 QProcess 参数列表

监控正在运行的 qprocess 并在 qprocess 完成时返回值

QProcess异常QT