许式伟的架构课
许式伟
七牛云CEO
立即订阅
20090 人已学习
课程目录
已更新 72 讲 / 共 77 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 怎样成长为优秀的软件架构师?
免费
基础平台篇 (21讲)
01 | 架构设计的宏观视角
02 | 大厦基石:无生有,有生万物
03 | 汇编:编程语言的诞生
04 | 编程语言的进化
05 | 思考题解读:如何实现可自我迭代的计算机?
06 | 操作系统进场
07 | 软件运行机制及内存管理
08 | 操作系统内核与编程接口
09 | 外存管理与文件系统
10 | 输入和输出设备:交互的演进
11 | 多任务:进程、线程与协程
12 | 进程内协同:同步、互斥与通讯
13 | 进程间的同步互斥、资源共享与通讯
14 | IP 网络:连接世界的桥梁
15 | 可编程的互联网世界
16 | 安全管理:数字世界的守护
17 | 架构:需求分析 (上)
18 | 架构:需求分析 (下) · 实战案例
19 | 基础平台篇:回顾与总结
加餐 | 我看Facebook发币(上):区块链、比特币与Libra币
加餐 | 我看Facebook发币(下):深入浅出理解 Libra 币
桌面开发篇 (16讲)
20 | 桌面开发的宏观视角
21 | 图形界面程序的框架
22 | 桌面程序的架构建议
23 | Web开发:浏览器、小程序与PWA
24 | 跨平台与 Web 开发的建议
25 | 桌面开发的未来
26 | 实战(一):怎么设计一个“画图”程序?
27 | 实战(二):怎么设计一个“画图”程序?
28 | 实战(三):怎么设计一个“画图”程序?
29 | 实战(四):怎么设计一个“画图”程序?
30 | 实战(五):怎么设计一个“画图”程序?
31 | 辅助界面元素的架构设计
课外阅读 | 从《孙子兵法》看底层的自然法则
加餐 | 想当架构师,我需要成为“全才”吗?
32 | 架构:系统的概要设计
33 | 桌面开发篇:回顾与总结
服务端开发篇 (14讲)
34 | 服务端开发的宏观视角
35 | 流量调度与负载均衡
36 | 业务状态与存储中间件
37 | 键值存储与数据库
38 | 文件系统与对象存储
39 | 存储与缓存
40 | 服务端的业务架构建议
41 | 实战(一):“画图”程序后端实战
42 | 实战(二):“画图”程序后端实战
43 | 实战(三):“画图”程序后端实战
44 | 实战(四):“画图”程序后端实战
45 | 架构:怎么做详细设计?
46 | 服务端开发篇:回顾与总结
加餐 | 如何做HTTP服务的测试?
服务治理篇 (11讲)
47 | 服务治理的宏观视角
48 | 事务与工程:什么是工程师思维?
49 | 发布、升级与版本管理
50 | 日志、监控与报警
加餐 | 怎么保障发布的效率与质量?
51 | 故障域与故障预案
52 | 故障排查与根因分析
53 | 过载保护与容量规划
54 | 业务的可支持性与持续运营
55 | 云计算、容器革命与服务端的未来
56 | 服务治理篇:回顾与总结
架构思维篇 (9讲)
57 | 心性:架构师的修炼之道
用户故事 | 站在更高的视角看架构
58 | 如何判断架构设计的优劣?
59 | 少谈点框架,多谈点业务
60 | 架构分解:边界,不断重新审视边界
加餐 | 实战:“画图程序” 的整体架构
61 | 全局性功能的架构设计
62 | 重新认识开闭原则 (OCP)
63 | 接口设计的准则
许式伟的架构课
登录|注册

21 | 图形界面程序的框架

许式伟 2019-07-02
你好,我是七牛云许式伟。
上一讲我们回顾了交互的演化历程。今天,我们将关注点收敛到现在仍然占主流地位的图形界面程序。它的结构如下图所示。
实现一个图形界面程序,最大的复杂性在于不同操作系统的使用接口完全不同,差异非常巨大。这给开发一个跨平台的图形界面程序带来巨大挑战。
好在,尽管操作系统的使用接口有异,但基本的大逻辑差不多。今天我们从统一的视角来看待,谈谈图形界面程序的框架。

事件

无论是什么桌面操作系统,每个进程都有一个全局的事件队列(Event Queue)。当我们在键盘上按了一个键、移动或者点击鼠标、触摸屏幕等等,都会产生一个事件(Event),并由操作系统负责将它扔到进程的事件队列。整个过程大体如下。
键盘、鼠标、触摸屏等硬件产生了一个硬件中断;
操作系统的硬件中断处理程序收到对应的事件(Event);
确定该事件的目标进程;
将事件放入目标进程的事件队列(Event Queue)。

窗口与事件响应

窗口(Window),也有人会把它叫视图(View),是一个独立可复用的界面元素(UI Element)。一个窗口响应发送给它的事件(Event),修改内部的状态,然后调用 GDI 绘制子系统更新界面显示。
响应事件的常见机制有两种。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《许式伟的架构课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(11)

  • 勇闯天涯
    高屋建瓴的视觉,大部分做应用层开发的同学缺乏这个视角的了解,感谢许老师!

    是不是只有从这个角度了解了系统,才能更好的开发一套应用系统出来?还需要哪些知识的了解?

    作者回复: 以上两讲是基础的背景知识,下一讲更为关键一些。

    2019-07-03
    5
  • lckfa李钊
    最近在研究Google的flutter框架,凭着其一统桌面端开发的野心,就值得好好学习下。从开发语言到框架都不同以往。不过本着太阳下没有新事物的原则,从消息循环到事件的响应开始深挖型学习,一切问题都不是事了。
    2019-07-02
    4
  • tech2ipo
    许老师,你好。Qt里面的信号和槽机制非常好用,实现了两个对象的同步通信和异步通信。您觉得信号和槽的性能和实时性怎么样?

    作者回复: qt 的 signal-slot 其实就是一种 delegate 机制

    2019-07-02
    4
  • Geek_88604f
    GUI程序逐渐被WEB应用程序替代,这里有哪些原因,许老师?

    作者回复: 下一讲会谈这个话题

    2019-07-06
    1
    3
  • Akon Convict
    醍醐灌顶 ,底层系统设计的思想大体是一致的!
    2019-07-03
    3
  • Dimple
    如果不是当初开发过Android App,这一节课的知识,看起来就不会那么顺了。事件分发、Looper、控件等等,庆幸自己搞过客户端开发
    2019-07-10
    1
    2
  • 靠人品去赢
    老师,如果做一个大的中间层来处理系统差异(类似硬件中我们处理硬件差异,驱动管理一样)。每个系统对应一个驱动来处理跨平台,会不会好一点,这种方案难点在哪?像Java,flutter跨平台的原理?

    作者回复: 后面会谈跨平台

    2019-07-04
    2
  • ljf10000
    “操作系统的硬件中断处理程序收到对应的事件(Event);
    确定该事件的目标进程;”

    如何确定目标进程呢?中断处理过程中获取当前系统的焦点进程?这里会有时间差啊。

    如果我按了alt+F4本意是关闭当前程序,而按键前后被病毒或流氓软件弹出新的窗口(独立进程),那么关闭的是谁?

    作者回复: 以上过程有省略,操作系统一级也是有键盘事件缓存的。有时候系统比较卡的时候我们按键盘主机的内置会有提示音,这是操作系统键盘缓冲满你的按键被丢弃的意思。至于确定目标窗口存在误差,这个从交互来说不是大问题

    2019-07-02
    1
  • wentworthhu
    老师,文章中提到“修改内部的状态,然后调用 GDI 绘制子系统更新界面显示”,其中涉及的GDI,我理解特指windows上。前面提到的Event等都不区分操作系统的,为啥提到图形绘制说GDI,那OpenGL不也是一种吗?为啥此处特指GDI呢,有点困惑。

    作者回复: 这里gdi是泛指。opengl也是一种gdi接口。

    2019-08-18
  • 随心而至
    好的实现方案大家都会相互借鉴,
    2019-07-02
  • Aaron Cheung
    打卡21 这方面还没有思考总结过
    2019-07-02
收起评论
11
返回
顶部