可靠地检测QProcess精加工

时间:2017-12-13 07:10:35

标签: qt qprocess

我有一个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,我认为它没有正常工作。

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

其次,如果的情况,你如何区分在你检查之前退出的流程与在你的超时开始之前没有退出的流程之间的区别?

1 个答案:

答案 0 :(得分:4)

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

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