如何判断应用程序是否被锁定或只是需要很长时间

How to tell if an application is locked up or just taking a long time

项目描述

我写了一个 plug-in 用于批量翻译 CAD 文件的 CAD 系统。我希望能够 运行 plug-in 无人值守。在处理 CAD 文件时,有时会从 CAD 程序本身请求用户交互。在这个项目中与我一起工作的另一个人使用 AutoIt 编写了一个程序来响应消息框,这适用于遇到的大多数情况。

plug-in使用Visual Studio2010用C++编写,脚本程序使用AutoIt。操作系统是Windows7.

问题

某些 CAD 文件会导致 CAD 程序锁定。我们试图通过使用 AutoIt 程序检查 window 标题中的 "Not Responding" 来克服这个问题,然后终止并重新启动 CAD 程序和 plug-in 并从它停止的地方继续。这适用于实际锁定 CAD 程序的文件。问题是 "Not Responding" 有时会出现在 window 标题中,而 CAD 程序只是需要很长时间才能完成,而实际上并没有被锁定。

当前Work-around

我们现在想出的work-around就是在"Not Responding"出现后在AutoIt程序中设置一个延迟,然后在重启程序之前再次检查。问题是它只是猜测设置计时器的时间。

问题

现在是我的问题。是否有 Windows API 我可以用来区分程序何时实际被锁定或只是花费很长时间?或者我是否只需要将计时器设置得足够高,我认为它足以应对这种情况?

不幸的是,变得无响应既不是考虑进程锁定的必要条件也不是充分条件。一个优秀的程序员可以轻松地保持 UI 响应,而算法线程已陷入无限循环。

要尝试的事情:

  • 开始创建 CAD 文件大小的日志,再次显示完成转换所花费的时间。这将使您能够快速估计给定输入大小的等待时间。如果这是相关的。这样,如果 CAD 程序在小输入时频繁锁定,您就不必等待很长时间。

  • 观察 CAD 程序在锁定时的行为。它是在旋转 CPU(无限循环)还是在低 CPU 利用率下死锁(可能是互斥体在等待彼此)?成功转换期间怎么样? CPU 是否总是因为发生交错 IO 而达到最大值或上下波动?如果您发现差异模式,那么这可能会帮助您区分仍然 运行 和死锁。

  • 将失败的 CAD 文件发送给您的 CAD 供应商,让他们修复代码(哈哈,我知道)。