事件驱动计算机领域的事件驱动 (事件驱动计算机)
本文目录导航:
事件驱动计算机领域的事件驱动
事件驱动在计算机领域的应用,主要是通过事件的触发来执行相应的操作。
事件不仅限于用户操作,如点击按钮,还涵盖了硬件事件和软件事件,如时钟事件和操作系统事件。
事件驱动的核心是事件,它由三个主要部分组成:事件收集器、事件发送器和事件处理器。
事件收集器负责收集所有事件,事件发送器负责将事件分发到目标对象,而事件处理器执行具体的事件响应工作,通常在实现阶段确定,需要运用虚函数机制。

事件处理器是事件驱动程序中唯一可见的部分,也是开发者关心的内容。
视图作为事件发送器的目标对象,接受事件并进行处理。
在事件驱动程序中,从传统流线型程序结构转变为事件触发方式,使得应用程序具备相当的灵活性,能够应对离散和随机的事件。
基于事件驱动模型的Windows操作系统,为实现应用程序框架提供了便利。
在Windows系统中,事件收集器和部分事件发送器已被实现,这大大简化了开发过程。
事件处理器通常需要通过宏(如DECLARE_EVENT_TABLE)来绑定事件和处理函数,实现事件处理。
在weWidgets框架中,所有可以处理事件的类都继承自wxEvtHandler,包括窗口、按钮、菜单、文档等。
这些类可以包含事件表,用于绑定事件和对应的处理函数。
建立事件表的过程包括创建新类(继承自wxEvtHandler)、声明处理函数、在类声明中使用宏(BEGIN_EVENT_TABLE和END_EVENT_TABLE)绑定事件和函数,以及指定事件处理函数的参数类型(wxCommandEvent)。
在事件处理中,wxWidgets会将事件的枚举数映射到对应的处理函数,并调用该函数。
所有在事件表中被绑定的函数具有特定的形式:返回类型为void,非虚函数,参数类型为wxCommandEvent。
这种机制使得事件驱动程序能够灵活地响应各种事件,实现动态的操作。
在持续事务管理过程中,进行决策的一种策略,即跟随当前时间点上出现的事件,调动可用资源,执行相关任务,使不断出现的问题得以解决,防止事务堆积。
在计算机编程、公共关系、经济活动等领域均有应用。
事件驱动的计算机领域的事件驱动
所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数).当然事件不仅限于用户的操作. 事件驱动的核心自然是事件。
从事件角度说,事件驱动程序的基本结构是由一个事件收集器、一个事件发送器和一个事件处理器组成。
事件收集器专门负责收集所有事件,包括来自用户的(如鼠标、键盘事件等)、来自硬件的(如时钟事件等)和来自软件的(如操作系统、应用程序本身等)。
事件发送器负责将收集器收集到的事件分发到目标对象中。
事件处理器做具体的事件响应工作,它往往要到实现阶段才完全确定,因而需要运用虚函数机制(函数名往往取为类似于HandleMsg的一个名字)。
对于框架的使用者来说,他们唯一能够看到的是事件处理器。
这也是他们所关心的内容。
视图(即我们通常所说的“窗口”)是“事件驱动”应用程序的另一个要元。
它是我们所说的事件发送器的目标对象。
视图接受事件并能够对其进行处理。
当我们将事件发送到具体的视图时,实际上我们完成了一个根本性的变化:从传统的流线型程序结构到事件触发方式的转变。
这样应用程序具备相当的柔性,可以应付种种离散的、随机的事件。
由于Windows本身是基于“事件驱动”模型的。
因而在Windows操作系统下实现应用程序框架有相当的便利。
在事件驱动程序的基本单元中,事件收集器已经由Windows系统完成;事件发送器也已经由Windows完成了部分内容。
之所以是部分而非完全是因为Windows是用C语言实现的,而不是C++。
由于没有对象,Windows将事件发送到所谓的“窗口函数”中(尽管不是发送到具体的对象,但应该说这是面向对象方式实现的一个变体)。
要感谢Windows做了这件事。
确定事件的目标所要做的工作的复杂可能要超出我们的想象。
wxWidgets的中所有可以处理事件的类都继承自wxEvtHandler,其中包含frames,buttons,menus,even documents,所有的窗体类(即从wxWindow继承的类)和程序类(application class).这些类可以有一个事件表,用来绑定事件和被调用的函数(handler functions).过程 3.2. 建立一个静态事件表(即编译时生成的事件表)的操作步骤建立一个新类(直接或间接从wxEvtHandler继承)为每个要处理的事件声明被调用的函数在被处理的事件所在的类的声明中加入宏DECLARE_EVENT_TABLE在宏BEGIN_EVENT_TABLE... END_EVENT_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)//不必与枚举数绑定,因为产生该类型的事件的对象是thisEVT_BUTTON (wxID_OK,MyFrame::OnButtonOK)END_EVENT_TABLE()在事件中指定被绑定的数字,wxWidgets会将其映射到对应的函数,并调用函数所有在事件表中被绑定的函数有相似的形式:返回值都是void,不是virtual函数,参数为wxCommandEvent类型
什么是事件驱动编程机制
要理解事件驱动和程序,需与非事件驱动程序进行对比。
现今多数程序为事件驱动,如多线程程序。
早期则有许多非事件驱动的程序,这类程序在需等待某个条件触发时,会不断检查该条件,直至满足。
相比之下,事件驱动的程序在无需处理时,有机会释放CPU进入睡眠态,待事件触发时被操作系统唤醒,从而更高效地利用CPU资源。
事件驱动程序的典型形态为一个包含两个部分的死循环,以线程形式存在。
第一部分是接收并筛选需要处理的事件,第二部分是处理事件的过程。
程序的执行即为选择并处理事件,无事件触发时,程序会进入睡眠状态释放CPU。
事件驱动的程序直接或间接拥有一个事件队列,用于存储未及时处理的事件。
程序的执行行为完全由外部输入的事件控制,因此,在事件驱动的系统中,存在大量此类程序,它们以事件作为主要的通信方式。
事件驱动的程序还有一大优势,即能按事件的触发顺序处理队列中的事件。
这一特性常用于保证某些过程的原子性,确保程序执行的完整性和正确性。
总结而言,事件驱动的程序通过有效利用CPU资源、灵活处理外部事件以及保证过程原子化等特性,在现代计算环境中展现出强大的优势。