作者 | dog250

责编 | 屠敏

出品 | CSDN博客

在之前使用Windows XP的时候,都会有这样的经历,即打开一大堆的窗口,在任务栏排的满满的,同样程序的不同程序还可以分组,看似很有条理的样子…

不光Windows,Linux桌面、MacOS竟然也学着Windows的样子,也这么做。当然了,我没有扒过GUI的历史,也不敢确认这种携带任务栏的GUI桌面到底是源自何方,不过无所谓,就假设它是微软的原创吧。

一直纳闷,Windows的手机和平板总是看起来别别扭扭的,也不知道哪里出了问题。后来终于找到了这件事和任务栏的关联。

在手机,平板这种屏幕有限,且用户关注单一全屏UI的环境下,根本就没有任务栏存在的必要,推而广之,其实就算在Windows XP上,也不需要有任务栏,那为什么要有任务栏?

我假设任务栏是从微软开始设计出来的。

任务栏是为了暂存GUI程序的窗口的,虽然桌面本身就已经支持了重叠窗口,但是为了让桌面可以更加整洁些,Windows允许将非前台的程序窗口最小化暂存到任务栏,等到它获得焦点的时候,再恢复它到前端。

现在的问题是,为什么要暂存一个GUI窗口,直接结束掉这个程序不行吗?答案看起来很简单,因为有很多的状态需要尚未保存和同步,比如用户可能在记事本上输入了一句不完整的话等等。

但这根本不是问题的满意答案,系统完全可以在结束这个GUI程序时自动保存状态啊,在用户看来,用户关心的是,只要它恢复的时候能保持和它上次离开焦点时的样子一致就可以了,而这些都是可以系统后台完成的啊。

任务栏根本就不需要,在GUI桌面系统,任何时候有且只有一个GUI程序的窗口时焦点窗口,系统可以随时结束任何非焦点的GUI程序,只要当它再次希望获得焦点时,恢复到系统关闭它时的状态即可。

没错,Android等手机,平板操作系统就是这么控制GUI窗口的,对于这些手机操作系统而言,一个小小的屏幕上往往只有一个程序在获取输入和输出,以上的特征更加明显,那么后台的程序便可以随时持久化后被系统结束掉,以节约能耗,当用户再度切换到该程序的时候,系统重新运行该程序就好了,然后反序列化同步状态即可。

Android和Windows的差别在于,到底是谁来结束GUI程序的差别,Android将控制权完全掌握在系统手中,而Windows XP则将控制权交给了用户。

在Windows XP看来,它是把所有的程序的控制权都交给了用户了,并没有对GUI程序加以区别,这是老式UNIX的传统。然而,GUI程序有所不同。

和服务器程序比如Apache需要持续侦听端口提供服务不同,GUI程序的运行几乎完全靠用户的操作来驱动,一旦失去焦点,GUI程序几乎是无事可做的,它就静静地hang在哪里,平白无故地占用着系统的资源,而这是没有必要的。

Windows 8开始有了Metro界面,新的GUI控制改变了Windows XP的做法,它也可以在保证状态同步的前提下,随时结束非焦点GUI程序了。然而,毕竟有历史的兼容性包袱,Windows 8做的并不纯粹,它仍然可以用任务栏来暂留GUI程序窗口。怪不得Surface的界面总是那么别扭,估计也有这方面的原因。

可能有人会有疑问,这样岂不是不能同时协同操作多个GUI程序了吗?

事实上并不是说只要GUI程序失去焦点就马上被关闭的,而是维持一个LRU链表,把最近超过多久不活跃的GUI程序关掉。

涉及到多个GUI程序之间切换的话,只需要为被关闭的GUI程序保留一个图标即可,只要save/restore做好,程序加载够快,就可以做到 像以前一样的自如切换。

在GUI程序失去焦点的时候获取事件,事件处理回调中保存上下文信息,这样一来,系统便可以在任何它觉得合适的时候结束掉该GUI程序了,比如该程序太久不活动,比如电池电量少于40%,比如CPU过热等等。最直接的策略还是维护一个LRU链表,把最近最不经常使用的GUI程序结束掉,以维持资源消耗在一个可以接受的水平。

不过,GUI进程生命周期是由用户控制还是由系统控制,这是一个永远都会有争议的话题。这就像微内核和大内核谁好谁坏一样。

另外,专业人士喜欢把电脑桌面仅留一张背景然后所有东西都扔进开始菜单,这个估计也是微软给带的。事实上,真实情况是,当你真的在使用电脑的时候,桌面背景很少有机会完全显露。在我看来,正确的做法应该是将应用程序分组,然后合理布局在桌面上,就像MacOS那样,就挺好。

版权声明:本文为CSDN博主「dog250」的原创文章。

谁来结束 GUI 程序?| CSDN 博文精选相关推荐

  1. wxPython:Python首选的GUI库 | CSDN博文精选

    作者 | 天元浪子 来源 | CSDN博客 文章目录 概述 窗口程序的基本框架 事件和事件驱动 菜单栏/工具栏/状态栏 动态布局 AUI布局 DC绘图 定时器和线程 后记 概述 跨平台的GUI工具库, ...

  2. 万字长文详解如何用Python玩转OpenGL | CSDN 博文精选

    作者 | 天元浪子 来源 | CSDN博文精选 [编者按]OpenGL(开放式图形库),用于渲染 2D.3D 矢量图形的跨语言.跨平台的应用程序编程接口,C.C++.Python.Java等语言都能支 ...

  3. IntelliJ IDEA 2019.3 正式发布,给我们带来哪些新特性?| CSDN 博文精选

    作者 | _YourBatman 责编 | 屠敏 出品 | CSDN 博客 前言 千呼万唤始出来.自从JetBrains在今年7月24日发布了IDEA 2019.2版本后,从9月份开始我便一直在关注此 ...

  4. 数学建模三剑客MSN | CSDN博文精选

    作者 |  天元浪子 来源 | CSDN博文精选 (*点击阅读原文,查看作者更多精彩文章) 1.前言 2.三剑客之Numpy 2.1 数组对象 2.1.1 数据类型 2.1.2 创建数组 2.1.3 ...

  5. PyTorch实现L2和L1正则化的方法 | CSDN博文精选

    作者 | pan_jinquan 来源 | CSDN博文精选 目录 1.torch.optim优化器实现L2正则化 2.如何判断正则化作用了模型? 2.1未加入正则化loss和Accuracy 2.1 ...

  6. 使用自己的数据集训练MobileNet、ResNet实现图像分类(TensorFlow)| CSDN博文精选

    作者 | pan_jinquan 来源 | CSDN博文精选 之前写了一篇博客<使用自己的数据集训练GoogLenet InceptionNet V1 V2 V3模型(TensorFlow)&g ...

  7. 一文读懂GoogLeNet神经网络 | CSDN博文精选

    作者 | .NY&XX 来源 | CSDN博客 本文介绍的是著名的网络结构GoogLeNet,目的是试图领会其中结构设计思想. GoogLeNet特点 优化网络质量的生物学原理 GoogLeN ...

  8. 云原生开发环境初探 | CSDN 博文精选

    作者 | 倚天码农 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 此前,我们分享了云原生的引申含义(https://blog.csdn.net/weixin_38748858/arti ...

  9. 贝塞尔曲线之爱心点赞代码全解析!| CSDN 博文精选

    作者 | 威威喵 责编 | 屠敏 出品 | CSDN 博客 直接步入正题,我们要实现的是一个 Android 客户端应用里面的一种点赞效果,比如你点一下那个爱心型的图片,就会产生一个小爱心,而且会以曲 ...

最新文章

  1. Python 获得命令行参数的方法
  2. 关于eclpse java项目与tomcat jdk版本不一致的解决方法
  3. 最小货架剩余寿命\总货架寿命\最大仓储时间
  4. VS2010 无法计算HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0@VCTargetPath处的属性表达式...
  5. jsp mysql登录 demo_java jsp+servlet+mysql实现登录网页设计
  6. javascript框架比较(四)
  7. Linux移植随笔:又遇困难
  8. 电脑无法读取移动硬盘_移动硬盘U盘提示:文件或目录损坏且无法读取如何解决?...
  9. redis(版本redis-5.0.2)的安装步骤
  10. python3速查参考- python基础 5 - 常用的文件操作
  11. 【名牌电脑制作隐藏分区与释放隐藏分区的方法】
  12. 好用的PC端wifi分析工具NetSpot免费版
  13. 忘记网站后台密码 PHP+mysql+md5 破解
  14. postgresql.conf log_rotation_size
  15. 2021年日本互联网服务业发展现状:ZHD和LINE 的合并将改变日本互联网行业格局[图]
  16. python进行谱曲_python创作音乐_ 计算机创作,计算音乐
  17. 流量卡物联网卡管理平台源码|PHP管理系统源码 成品可商用系统
  18. vue项目引入并使用svg格式图标文件
  19. 数字游戏——数位dp问题
  20. sqltrace相关汇总

热门文章

  1. [delphi]窗口最大化时怎么才能不要把任务栏盖住
  2. dev项目属性按钮是灰色_如何当按钮处于各种交互状态时具有不同样式的按钮?...
  3. dp(0,1背包)-----高数Umaru系列(9)——哈士奇
  4. 【图像处理】MATLAB:亮度变换
  5. 剑指offer之数组中的数据查找
  6. hive创建java函数_spark通过java的api创建hive的UDF用户自定义函数
  7. javascript控制页面控件隐藏显示的两种方法
  8. 打造 AI 语音新标杆,英特尔与腾讯云小微创新共赢
  9. Airflow任务调度延时问题分析和优化
  10. 软件先行的英特尔,为开发者们带来了什么?