事件驱动是一种以事件触发为核心的系统设计模式,指程序或系统通过收集、分发、处理事件实现任务响应的运作机制,广泛应用于计算机编程、物联网、分布式系统、公共关系及经济模型构建等领域。其核心要素包含事件源、事件处理器及事件通道,通过异步非阻塞处理机制实现系统解耦 [1-2] [5]。
在软件架构中,事件驱动架构(EDA)以松耦合组件通过事件通道进行异步通信为特征,包含事件队列、分发器和事件处理器三个组成部分 [3] [7]。技术实现涵盖语言特定框架(Node.js/Python Twisted)与设计模式(发布-订阅/观察者模式),典型应用场景包括GUI交互、微服务通信、实时数据分析、公共关系协调及经济模型预测 [1] [3-4]。
硬件领域通过事件驱动架构应对低功耗需求,如MEMS陀螺仪采用事件驱动实现1.5µW常开功耗与2.8ms唤醒时间,通过动态占空比调节维持宽温域稳定运行 [6]。工业系统中该架构支持设备状态监控与实时报警,通过事件持久化存储提升系统可靠性 [4]。
- 中文名
- 事件驱动
- 外文名
- Event-driven
- 定 义
- 在持续事务管理过程中,进行决策的一种策略
解释
播报编辑
所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数).当然事件不仅限于用户的操作. 事件驱动的核心自然是事件。从事件角度说,事件驱动程序的基本结构是由一个事件收集器、一个事件发送器和一个事件处理器组成。事件收集器专门负责收集所有事件,包括来自用户的(如鼠标、键盘事件等)、来自硬件的(如时钟事件等)和来自软件的(如操作系统、应用程序本身等)。事件发送器负责将收集器收集到的事件分发到目标对象中。事件处理器做具体的事件响应工作,它往往要到实现阶段才完全确定,因而需要运用虚函数机制(函数名往往取为类似于HandleMsg的一个名字)。对于框架的使用者来说,他们能够看到的是事件处理器。这也是他们所关心的内容。
视图(即我们通常所说的“窗口”)是“事件驱动”应用程序的另一个要元。它是我们所说的事件发送器的目标对象。视图接受事件并能够对其进行处理。当我们将事件发送到具体的视图时,实际上我们完成了一个根本性的变化:从传统的流线型程序结构到事件触发方式的转变。这样应用程序具备相当的柔性,可以应付种种离散的、随机的事件。
由于Windows本身是基于“事件驱动”模型的。因而在Windows操作系统下实现应用程序框架有相当的便利。在事件驱动程序的基本单元中,事件收集器已经由Windows系统完成;事件发送器也已经由Windows完成了部分内容。之所以是部分而非完全是因为Windows是用C语言实现的,而不是C++。由于没有对象,Windows将事件发送到所谓的“窗口函数”中(尽管不是发送到具体的对象,但应该说这是面向对象方式实现的一个变体)。要感谢Windows做了这件事。确定事件的目标所要做的工作的糊朵承复杂可能要超出我们的想象。
wxWidgets的中所有可以处理事件的类都继承自wxEvtHandler,其中包含frames,buttons,menus,even documents,所有的窗体类(即从wxWindow继承的类)和程序类(application class)
建立采匙一个新类(直接或间接从wxEvtHandle全劝肯r继承)
为每个要处理的事件声明被调用的函数
在被处理的事件所在的类的声明中加入宏DECLARE_EVENT_TABLE
在宏BEGIN_EVENT_TABLE...希汗 END_EVE付厚NT_TABLE(就是事件表)中将函数与枚举的数字绑定(因为产生该类型翻弃备的事件的按钮可以任意一个,要用枚举数来区分);有些事件不必与枚举数绑定,因为产生该类型的事件的对象可以确定(比如就是this)。
例子
播报编辑
例 3.1. 一个事件表
BEGIN_EVENT_TABLE(MyFrame,wxFrame)
EVT_MENU (wxID_ABOUT,MyFrame::OnAbout)
EVT_MENU (wxID_EⅪT,MyFrame::OnQuit)
EVT_SIZE (MyFrame::OnSize)
//不必与枚举数绑定,因为产生该类型的事件的对象是this
EVT_BUTTON (wxID_OK,MyFrame::OnButtonOK)
END_EVENT_TABLE( )
在事件中指定被绑定的数字,wxWidgets会将其映射到对应的函数,并调用函数