[table][tr][td] 今晚突发奇想想写点关于电脑的科普。我从小对很多有关电脑的事情很好奇,但一直苦于不知道why,直到我成为了一名老司机……哦不,是永远的18岁
于是我想做成一个系列,送给同样对IT充满好奇的坛友们。如果你有特别想知道的话题,可以PM给我,下一篇也许我可以用尽量浅显的方式讲出来。(PC系统的话,Windows为主)
那么进入正题~
我们在用 Windows的时候经常会遇到有程序 “卡死”的情况,具体症状就是…这样
每次遇到这种事儿,除了<strike>像当妈一样哀叹真倒霉</strike>和<strike>打开361安全萎士各种清理</strike>之外,有没有想过:
Windows怎么知道程序有没有响应的?
在解释这个之前,我先解释一下Windows图形界面程序是如何和用户交互的
想象以下情景:用户把鼠标移动到程序A的某个按钮上,按下了鼠标左键。
此时的台面下…
程序A:有我的事儿吗?
Windows:没有。
程序A:有我的事儿吗?
Windows:没有。
……
程序A:有我的事儿吗?
Windows:有一个鼠标左键按下的消息(<strike>WM_LBUTTONDOWN)</strike>,坐标是X 350,Y 200,你处理一下。
程序A:知道了~诶都……【抓取信息】按钮啊。
于是一阵折腾……
程序A:有我的事儿吗?
Windows:没有。
……
用户和程序的交互,就是在 不断的询问中处理各种消息,从而实现的。用户的很多操作都是消息,比如 移动鼠标,按下键盘,等等
当然,这是理想情况。如果程序稍微有点忙,忘记了(或者说不能去)不断地询问Windows有没有新的消息,会发生什么?
Windows:嗯?这货怎么连续 5秒钟没问过我了,是不是开小差去了?我先不管你,但是你连用户拖动窗口都不搭理了,挡在前面像什么话……
于是,Windows把那个卡住的窗口 藏了起来,并且用一个 幽灵窗口(Ghost Window)替代了它。这个窗口拥有和程序A原本的窗口一致的 位置、样式、标题(只不过多了个未响应的字样)。当然,窗口里的内容就是Windows记录下的,程序 最后一次画到屏幕上的样子(所以假如它是个视频软件,画面是冻结的)。
这样,用户就可以移动、最小化、甚至关闭这个幽灵窗口, 而不妨碍用户的工作(如果点击了幽灵窗口的关闭,系统会考虑强制杀死程序A的进程)。
题外话
其实,微软<strike>巨硬</strike>官方就管这个功能叫Windows Ghosting(窗口幽灵化)。我找到了MSDN(微软开发者网络)的一篇博客(鹰语),里面有这样一段话,我翻译如下:
当我们在致力于Windows XP的开发时,我们意识到我们去了解这些反应迟钝的应用是个好主意。我们已经开始收集关于崩溃的报告——这些崩溃显然会让客户很不爽,一些学派(和一些研究)也表示迟钝的UI甚至更令人恼火——有人甚至会去使用“暴跳如雷”这样的词。所以,我们决定把幽灵窗口的关闭按钮和底层给微软发送错误报告的程序连接起来……然后你看!假死报告就诞生了(译者注:我觉得这个令我更加不爽!)。
其实,我们每天打交道的Windows之所以是一个成功的系统,背后是无数的考量和<strike>脑洞</strike>。善于观察生活中的现象,你会发现很多有意思的事情。
Fin.
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |