Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QProcess-甚至可以获取退出状态!=0或'waitForFinished()'在真实场景中返回False_Qt - Fatal编程技术网

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
。但是,如果您想在外部进程中检测崩溃,这并不是那么简单。至少在my
QProcess中。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)