- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想知道一个进程(以 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/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!