zoukankan      html  css  js  c++  java
  • 应用程序挂起的秘密

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

    当一个应用程序(或者更准确定的说,一个线程)在桌面上创建一个窗口时,它会执行一个桌面窗口管理工具( 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
    此文章很好。

  • 相关阅读:
    Leetcode——栈和队列(3)
    Leetcode——栈和队列(2)
    java——面试题 基础(上)
    Leetcode——栈和队列(1)
    LeetCode——动态规划整理(2)
    LeetCode——动态规划整理(1)
    计算机网络——数据中心(下)
    计算机网络——数据中心(上)
    计算机网络——HTTP(下)
    计算机网络——HTTP(上)
  • 原文地址:https://www.cnblogs.com/xiaokang088/p/3042746.html
Copyright © 2011-2022 走看看