【问题标题】:Checking "liveness" of a Windows application?检查 Windows 应用程序的“活跃度”?
【发布时间】:2012-03-13 20:09:03
【问题描述】:

我有一个运行一些昂贵设备的 Windows 应用程序;这个应用程序以各种创造性的方式消亡。通常,当它发生时,该过程会完全终止。我编写了一个小监控程序,它在当前正在运行的事物列表中查找进程的名称,这对那些失败很有用。但有时它会变得完全没有响应,需要通过任务管理器终止,但在某种无益的意义上仍然“运行”。

我对 Windows API 完全不熟悉,所以这可能有点牵强,但是我可以做些什么来以编程方式检查其他进程的“活跃度”吗?或者我可以用来猜测? (等待它停止处理来自操作系统的事件,或等待所有磁盘访问/内存分配停止等)

最好是我可以通过 Python win32 模块做的事情,但我会扩展到任何可以成功检测到这个东西何时锁定的事情。而且,我意识到“活跃度”是模糊的,但我不想排除任何可能性,尤其是当我对这件事是如何失败的没有任何洞察力的时候。

【问题讨论】:

  • 昂贵的设备??那究竟是什么?我也认为你应该从内部而不是从外部解决你的问题。
  • 如果这是一个选项,那就太好了,我会追求它。那不是一个选择。这是一个完全合理的问题,因为世界上到处都是运行重要机器的闭源软件。我真的不在乎详细介绍确切的软件或机器,因为对我来说没有好处。制造商可能会因投诉而脾气暴躁的微小风险不值得满足您的好奇心。我只提到设备是为了激发我对答案的渴望,并避免“只使用不同的东西”的建议。
  • 我认为解决方案因具体挂起的内容而异。如果它是一个窗口,那么 SecurityMatt 的建议听起来不错。否则,我认为您只需“检查”该应用程序即可找到该应用程序发出的某种通知,该通知说“我还活着”或“我要挂了”。除非线程已被显式挂起,否则我所知道的任何类型的标志都不会告诉您线程已挂起(例如在无限循环中)。
  • @JayKominek 等一下,你说“有时它会变得完全没有响应”,是 windows 应用程序还是你的监控程序?如果是应用程序,此时您真正想做什么?找出它是否仍然存在或重新启动进程?
  • 应用程序无响应。监控程序认为应用程序仍在运行。我真正想要的是找出程序什么时候不再做任何事情,这样我就可以通知一个活生生的人。 (自动重启应用效果不是很好。)

标签: python windows winapi pywin32


【解决方案1】:

我认为最好的方法是在 WIN32 API 中使用Process & Thread functions。注意:您可以轻松地在 python 中嵌入 C++ 代码。这可能需要一些时间和耐心,而我自己并不了解其中的大部分功能。

另一方面,在 Codeproject 上的 Process MonitoringPython WMI 上有一个详细的项目,它是 Python 中 WMI 的包装器,但请记住 WMI 相当慢,您必须确保服务在 PC 上运行。

您也有可能send a message to the process 会导致进程提供回复或更改其状态(如果它处于活动状态),然后在一段时间内检查进程中的此更改。

【讨论】:

【解决方案2】:

您需要获取相关窗口的 HWND 句柄(EnumWindowHandles 可能是一个好的开始),然后尝试调用 IsHungAppWindow 以查看系统是否认为它没有响应。

【讨论】:

    猜你喜欢
    • 2019-05-30
    • 2020-09-29
    • 2018-05-31
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    相关资源
    最近更新 更多