应用程序挂起的秘密

挂起  –  从操作系统角度来看 

当一个应用程序(或者更准确定的说,一个线程)在桌面上创建一个窗口时,它会执行一个桌面窗口管理工具( Desktop Window Manager , DWM )的隐式的协议来及时的处理窗口消息。 DWM 回发消息(键盘 / 鼠标的输入以及来自于其他窗口或窗口本身的消息)到一个特定线程的( thread-specific )消息队列。该线程将会通过它的消息队列获取并发送这些消息。如果线程没有通过调用 GetMessage() 来为队列服务,则消息将不会被处理,并且窗口会挂起:此时,既不能刷新屏幕也不能接受任何来自于用户的输入。系统会通过向消息队列中的等待消息( pending messages )加入一个计时器来监测到这一状态。如果一条消息 5 秒内没有被获取,那么 DWM 会声明窗口处于挂起状态。您可以使用 IsHungAppWindow() API 来查询特殊窗口的状态。

监测只是第一步。这时,用户仍然不能终止该应用程序 – 点击 X (关闭)按钮可能会引起 WM_CLOSE 消息,它会像其他消息一样被放入消息队列中。 DWM 会无缝的隐藏被挂起的窗口,并在原始窗口的位置上把它替换成一幅图片(并在标题栏上加上“没有响应”)。只要原始窗口的线程没有获取消息, DWM 会同时管理两个窗口,但是只允许用户与替换的窗口进行交互。使用替换的窗口的时候,用户只可以移动,最小化以及——最重要的——关闭没有响应的应用程序,但是不能改变其内部的状态。

详见:
预防Windows应用程序挂起
http://msdn.microsoft.com/zh-cn/library/ee461321.aspx
此文章很好。

原文地址:https://www.cnblogs.com/xiaokang088/p/3042746.html