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
    此文章很好。

  • 相关阅读:
    操作系统设计与实现(二)
    SpringCloud(八)Consul的微服务注册
    图的实现(邻接矩阵)及DFS、BFS
    SpringCloud(七)服务注册之Consul的简介和原理
    Mybatis笔记目录(6天)
    Mybatis学习笔记——day02
    C语言教程Day01
    Linux C/C++方向开发(13周学习路线)
    基于Java的实验室预约管理系统
    基于Android的高校学生考勤系统的设计与实现
  • 原文地址:https://www.cnblogs.com/xiaokang088/p/3042746.html
Copyright © 2011-2022 走看看