QProcess - 甚至可以获得退出状态!= 0或`waitForFinished()`在实际场景中返回False

时间:2016-01-19 06:06:56

标签: qt

我花了几个小时处理一个非常简单的问题 - 确定子进程(使用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才能完成。

0 个答案:

没有答案