可靠地检测QProcess完成

3
我有一个使用QProcess运行外部程序的Windows Qt应用程序,这个程序可能需要输入,也可能不需要。如果需要输入,则始终为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文档,其中包含这个宝石: bool QProcess :: waitForFinished(int msecs = 30000)。阻塞直到进程结束并发出finished()信号,或者直到msecs毫秒过去。如果进程完成,则返回true;否则返回false(如果操作超时,发生错误或此QProcess已经完成)。我怀疑最后一句话是在咬我。因为当你输入“y”时,进程立即退出,所以我认为当我首次调用WaitForFinished()时,它已经不在了。所以那个函数会返回false,我会认为它没有正常工作。所以基于此,我有两个问题。首先,我的理解正确吗?有没有可能进程在检查之前就已经退出了,这会导致错误的返回值。其次,如果情况确实如此,你将如何区分先退出的进程和在超时之前没有退出的进程呢?

正如在source code中所看到的,它会检查进程状态是否为QProcess::NotRunning,如果是,则返回false。在调用QProcess::waitForFinished之前,您可以自己进行此检查。 - thuga
1个回答

4

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接