Qt QProcess-甚至可以获取退出状态!=0或'waitForFinished()'在真实场景中返回False
我花了几个小时处理一个非常简单的问题——确定子进程(使用Qt QProcess-甚至可以获取退出状态!=0或'waitForFinished()'在真实场景中返回False,qt,Qt,我花了几个小时处理一个非常简单的问题——确定子进程(使用QProcess)是否正常崩溃或退出。最大的困惑来自这样一个事实,即QProcess.waitForFinished基本上创建了三个必须观察的值: 方法本身的返回值根据文档,如果过程已完成,则该值为True。否则(在超时、出现错误或进程已完成的情况下)为False ExitCode-这是外部进程的退出代码 ExitStatus-这是QProcess 我发现文档非常混乱(对我来说就是这样)。我的任务是从一个单独的线程启动一个子进程,然后使
QProcess
)是否正常崩溃或退出。最大的困惑来自这样一个事实,即QProcess.waitForFinished
基本上创建了三个必须观察的值:
- 方法本身的
根据文档,如果过程已完成,则该值为返回值
。否则(在超时、出现错误或进程已完成的情况下)为True
False
-这是外部进程的退出代码ExitCode
-这是ExitStatus
QProcess
QProcess.waitForStarted()
,QProcess.waitForFinished()
等来监视它,并向UI报告
起初我认为捕获QProcess.waitForFinished()
的return
值就足够了。它确实适用于QProcess.waitForStarted()
,在那里它像一个符咒一样工作-如果我能够启动进程,我得到True
,否则-False
。但是,如果您想在外部进程中检测崩溃,这并不是那么简单。至少在myQProcess中。waitForFinished()
始终返回True
。不仅如此,ExitStatus
也始终为0。这需要一些调查
例如,如果我执行以下操作(我在这里使用的是PyQt4):
我总是进入if
的主体,从不访问else
,无论进程是否崩溃(我首先运行了一个Python脚本,用零除法导致崩溃,然后尝试sys.exit(1)
)。现在我猜这个方法的返回值与外部进程无关,而是与连接到它的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)
我想知道在什么样的real场景中QProcess.waitForFinished()
返回False
或者ExitStatus
变为1?尤其是QProcess
实例没有正确完成的部分。我之所以排除超时情况,是因为我可以想象为什么这会很有用——例如,如果我们知道childprocess需要10毫秒才能完成,但突然需要20毫秒才能完成。waitForFinished()返回false不是在进程失败时,而是在未在指定时间内终止时(waitForFinished()的可选参数)。因此,对于及时崩溃的进程,它仍将返回true。如果waitForFinished()返回true且进程崩溃,exitStatus应反映崩溃(即等于QProcess.CrashExit)。相应地,对于exitCode()。文档中另有说明
:如果进程完成,则返回true;否则返回false(如果操作超时、发生错误或此QProcess已完成)。我主要想知道第二个问题是如何发生的。它与外部进程的状态无关,而是与QProcess
的实例有关。我会仔细检查。“如果发生错误”可能意味着QProcessactual进程通信出现问题。我不认为它指的是进程崩溃或返回并退出代码!=0(从QProcessPerspective来看这是完全有效的)。是的,它指的是QProcess
本身的实例,而不是我在使用waitForFinished()
的过程中发现的外部进程:D我想要一个返回False
的可靠场景。这对我来说很重要,因为我从UI应用程序开始的外部进程是至关重要的(与用户界面不同)并确保系统正常工作。
# 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)