Appearance
事件驱动机制
元信息
- 目标:理解"程序由谁驱动"这一软件运行的根本问题——从开发者驱动的批处理、用户驱动的轮询,到事件驱动;体会事件驱动把"等待输入"下沉给系统层带来的性能与结构优势
- 关键概念:运行流程、驱动方、轮询、事件驱动、监听、分派(dispatch)、事件处理函数
- 关联阶段:cp3
- 常见误区:以为事件是"页面上的点击"专有(定时器、页面装载完成等系统状态变化也是事件);以为监听是应用层在死循环等待(监听与分派由底层系统实现);把事件驱动与命令驱动当风格的差异(实为运行时结构的差异——注册回调、等待发生)
软件的运行流程
指一个程序的具体执行路径,由谁来驱动和确定,一般有如下类型:
- 由开发者主导,允许用户通过配置参数进行定制和驱动
- 开发者提供各种可能性,但由用户主导和驱动
开发者驱动
c
function main(){
do_something();
...
do_otherthing();
exit();
}命令行CLI软件:适合无人值守的批处理类场景,只在初始执行时接收用户输入参数或配置文件,执行中途不接收输入
用户驱动:轮询
c
function main(){
while( char = getc() ) {
switch(char)
case '1' do_something();
case '2' do_otherthing();
...
case 'n' break; // exit();
}
}命令行软件:适合用户介入的交互型场景,由main程序(应用层)持续等待(轮询)用户的输入。
问题:运行性能较低
用户驱动:事件
桌面软件GUI:由用户(主动)选择和决定程序(被动)的执行路径
事件的轮询(监听和分派)等功能由底层系统支持和实现,性能更优。
事件
- 事件是开发者、用户、系统之间进行协同的一种机制
- 开发者声明事件、编写事件处理函数
- 用户触发事件
- 系统接收和分派(dispatch)事件,执行相应的事件处理函数
- 事件是一种抽象,代表了软件的运行时行为,使得软件的功能更加动态
- 可能来自终端用户的输入,如键鼠
- 可能系统的状态变化,如页面装载完成、定时器等
- 事件的监听、分派、调用等,由底层系统支持,而非用户态的应用程序层,更节约系统资源,性能更优。