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