我花了几个小时处理一个非常简单的问题 - 确定子进程(使用QProcess
)是否已正常崩溃或退出。最大的困惑来自于QProcess.waitForFinished
基本上创造了三个值,这是必须遵守的:
return
值 - 根据文档,如果流程已完成,则此值为True
。否则(如果超时,某些错误或进程已经完成),则为False
ExitCode
- 这是外部流程的退出代码ExitStatus
- 这是QProcess
我发现文档很混乱(对我而言)。我的任务是从一个单独的线程启动一个子进程,然后使用QProcess.waitForStarted()
,QProcess.waitForFinished()
等监视它,并向UI报告。
起初我认为抓住return
的{{1}}值就足够了。肯定是QProcess.waitForFinished()
它的作用就像一个魅力 - 如果我能够开始我得到QProcess.waitForStarted()
的过程,否则 - True
。如果您想要检测外部进程中的崩溃,那就不那么简单了。至少在我的False
一直返回QProcess.waitForFinished()
。不仅如此,True
也始终为0。这需要一些调查。
如果我执行以下操作(我在这里使用PyQt4):
ExitStatus
我始终进入# Check if the process has finished properly
if self.ext_process.waitForFinished():
# Emit a signal with some predefined exit status to the UI indicating success
self.emit(self.signalFinishedExtProc, self.EXT_PROC_STATUS_OK_FINISHED)
else:
# Emit a signal with some predefined exit status to the UI indicating failure
self.emit(self.signalFinishedExtProc, self.EXT_PROC_STATUS_ERROR_FAIL_QUIT)
的身体,无论进程是否崩溃,都不会访问if
(我先运行Python脚本)用零除以导致崩溃,然后尝试else
)。现在我想这个方法的sys.exit(1)
值与外部进程完全没有关系,只与连接到它的return
实例有关(正如文档所指出的那样)。好的,公平的。我们继续......
下一步是检查QProcess
的用途。事实证明它也是ExitStatus
实例绑定的东西,而不是外部进程本身。所以到目前为止检查这两个给了我QProcess
实例的状态而不是外部进程
最后,我通过以下检查得到了它:
QProcess
我想知道真实方案可能# Check if the process has finished properly (both the QProcess instance and the external process itself by checking its exit code)
if self.ext_process.waitForFinished() and not self.ext_process.exitCode():
# Emit a signal with some predefined exit status to the UI indicating success
self.emit(self.signalFinishedExtProc, self.EXT_PROC_STATUS_OK_FINISHED)
else:
# Emit a signal with some predefined exit status to the UI indicating failure
self.emit(self.signalFinishedExtProc, self.EXT_PROC_STATUS_ERROR_FAIL_QUIT)
返回QProcess.waitForFinished()
还是False
变为1?特别是ExitStatus
实例无法正常完成的部分。我排除了超时情况,因为我可以想象为什么这可能有用 - 例如,如果我们知道子进程需要让我们说10ms完成,而是突然间需要20ms才能完成。