可靠检测 QProcess 整理

Reliable detection of QProcess finishing

我有一个 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,它有这个 gem:

bool QProcess::waitForFinished(int msecs = 30000)

Blocks until the process has finished and the finished() signal has been emitted, or until msecs milliseconds have passed.

Returns true if the process finished; otherwise returns false (if the operation timed out, if an error occurred, or if this QProcess is already finished).

怀疑可能是最后那句话戳到我了。由于进程在您输入 y 后立即退出,我认为当我到达第一次调用 WaitForFinished() 的时候它已经不存在了。因此该函数将 return 为 false,我假设它无法正常工作。

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

其次,如果这种情况,您如何区分在您检查之前退出的进程和在您检查之前未退出的进程-踢出去?

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

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