gpt4 book ai didi

c++ - QProcess ProcessState 足以阻止进程?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:20 29 4
gpt4 key购买 nike

我想知道一个进程(以 QProcess 类开始)是否不再响应。例如,我的进程是一个每秒只打印 1 的应用程序。

我的问题是我想知道(出于某种神秘的原因)该进程是否在短时间内被阻塞(超过 1 秒,这是人类可以注意到的)。

但是,QProcess 的不同状态(未运行、正在启动、正在运行)不包括“阻塞”状态。

我的意思是当我们在任务管理器中收到“无响应”消息时被阻止为“不响应操作系统”。例如当 Windows MMI(如 explorer.exe)被阻止并变为白色时。

但是:我想检测任何进程的“无响应”状态。不只是 MMI。

有没有办法检测到这种状态?

最佳答案

Qt 不为此提供任何 api。您需要使用特定于平台的机制。在某些平台(Windows!)上,没有挂起应用程序的概念,只有挂起窗口的概念。您可以拥有一个同时具有响应式和非响应式窗口的应用程序:)

在 Windows 上,您将使用 EnumWindows 枚举所有窗口,通过比较来自 GetWindowThreadProcessId 的 pid 来检查它们是否属于您的进程到process->pid(),最后通过IsHungAppWindow检查窗口是否挂起.

注意事项

通常,不存在“无响应”过程这样一个包罗万象的概念。

假设您有一个网络服务器。它没有响应是什么意思?它负载很重,因此它可能会拒绝某些传入连接。从您的角度来看,这是“无响应”吗?可能是这样,但您对此无能为力 - 终止并重新启动进程不会修复它。如果有的话,这将使已经连接的客户端的情况变得更糟。

假设您有一个进程正在阻止文件系统读取,因为它试图访问的特定驱动器速度很慢,或者负载很重。这是否意味着它没有响应?杀死并重新启动它总能解决这个问题吗?如果该进程随后重试从文件开头读取,则很可能会使事情变得更糟。

假设您有一个设计不佳的带有 GUI 的流程。它正在 GUI 线程中阻止串行端口读取。它正在执行的读取操作需要很长时间,并且 GUI 有几秒钟没有响应。你终止进程,它重新启动并再次尝试长时间读取 - 你只会让事情变得更糟。

在这里你必须非常小心

解决思路

有多种方法可以确定什么是“响应式”进程。已经提到,Windows 和 OS X 上的操作系统都会监视具有 GUI 的进程。因此可以使用 native API 来查询窗口或进程是否挂起。这对于提供 UI 并受上述警告约束的应用程序是有意义的。

如果流程正在提供服务,您可以定期使用该服务来确定它是否仍然可用,但要遵守某些截止日期。关于如何处理“挂起”进程的任何选择都应考虑系统的 CPU 和 I/O 负载。

保留服务对服务请求的响应延迟的历史记录可能是值得的。只有延迟的“大”变化才应被视为问题的指示。假设您正在跟踪平均延迟。人们可以将最终期限设置为之前平均延迟的 50 倍。错过这个最后期限,该服务被认为已经死亡并准备强制回收。 “ Action 标志”截止日期可以设置为平均延迟的 5-10 倍。然后,人们可以选择有序地重启服务。当延迟回落到比触发标志的截止日期低 30% 时,标志将自动删除。

如果你是被监控进程的开发者,那么你可以将监控方面倒过来,成为被监控进程的被动看门狗。然后,受监视的进程必须周期性地主动“唤醒”看门狗以表明它处于事件状态。唤醒信号(通用术语)的发射应在代码中的战略位置执行。定期接收唤醒“信号”应该可以让您推断该过程仍然存在。您可能有多个唤醒信号,标记有被监视进程中的位置。一切都取决于进程有多少线程,它在做什么等等。

关于c++ - QProcess ProcessState 足以阻止进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21547619/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com