可靠检测 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)
{
..
}
我有一个 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 untilmsecs
milliseconds have passed.Returns true if the process finished; otherwise returns
false
(if the operation timed out, if an error occurred, or if thisQProcess
is already finished).
我怀疑可能是最后那句话戳到我了。由于进程在您输入 y
后立即退出,我认为当我到达第一次调用 WaitForFinished()
的时候它已经不存在了。因此该函数将 return 为 false,我假设它无法正常工作。
所以我有两个基于此的问题。首先,我的理解正确吗?该过程是否有可能在检查之前退出并导致错误的 return 值。
其次,如果是这种情况,您如何区分在您检查之前退出的进程和在您检查之前未退出的进程-踢出去?
当你认为调用waitForFinished()
时进程已经关闭时,你应该检查进程是否为运行。
process.write("y\n");
process.waitForFinished(5000)
if(process.state() != QProcess::NotRunning)
{
..
}