精华内容
下载资源
问答
  • 事件驱动编程
    千次阅读
    2017-05-12 17:53:03

    为需要处理的事件编写相应的事件处理程序

    事件驱动的一般步骤:


    1、确定响应事件的元素

    2、为指定元素确定需要响应的事件类型
    3、为指定元素的指定事件编写相应的事件处理程序
    4、将事件处理程序绑定到指定元素的指定事件

    对于事件驱动模式,对象包括事件类型、事件对象、事件分发器、事件处理器,每种事件都有对应的事件处理器编写于处理函数中,

    事件分发器r是异步处理的事件的,处理逻辑中也可以包括发送下一个事件。

    对于状态机模式,基本做法是

    根据发生的事件和当前状态,来执行下一步的动作,并设置下一个状态,不同状态不同的事件处理方式,不同的转化状态。


    附加用状态机事件驱动开发的注释转化程序,C++注释转化为C注释。



    更多相关内容
  • 主要为大家详细介绍了Javascript事件驱动编程的相关资料,通过经典案例向大家介绍Javascript事件驱动编程,需要的朋友可以参考下
  • 收集了一些Java事件驱动编程相关实例源码,都是来自与国外的一些Java代码,里面注释丰富,不过是英文的。这些实例与事件驱动程序设计有关,比如事件监听、注册和处理、内部类监听器、匿名内部类监听器、处理简单行为...
  • 事件驱动 基本概念 窗口/组件 事件 消息(队列) 事件响应(服务处理程序) 调度算法 进程/线程 非阻塞I/O 程序的执行可以看成对CPU,内存,IO资源一次占用 现代操作系统支持...

    事件驱动

    基本概念

    • 窗口/组件

    • 事件

    • 消息(队列)

    • 事件响应(服务处理程序)

    • 调度算法

    • 进程/线程

    • 非阻塞I/O

    • 程序的执行可以看成对CPU,内存,IO资源一次占用

    • 现代操作系统支持多任务,可以分时复用上述资源.

    1. 为什么采用事件驱动模型?

    事件驱动模型也就是我们常说的观察者,或者发布-订阅模型;理解它的几个关键点:

    • 首先是一种对象间的一对多的关系;最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方);

    • 当目标发送改变(发布),观察者(订阅者)就可以接收到改变;

    • 观察者如何处理(如行人如何走,是快走/慢走/不走,目标不会管的),目标无需干涉;所以就松散耦合了它们之间的关系。

    2. 代码执行流程

    在传统的或“过程化”的应用程序中,应用程序自身控制了执行哪一部分代码和按何种顺序执行代码。从第一行代码执行程序并按应用程序中预定的路径执行,必要时调用过程。
    在事件驱动的应用程序中,代码不是按照预定的路径执行-而是在响应不同的事件时执行不同的代码片段。事件可以由用户操作触发、也可以由来自操作系统或其它应用程序调度算法的消息触发、甚至由应用程序本身的消息触发。这些事件的顺序决定了代码执行的顺序,因此应用程序每次运行时所经过的代码的路径都是不同的。

    3. 事件驱动模型

    在UI编程中,常常要对鼠标点击进行相应,首先如何获得鼠标点击呢?

    方式一:创建一个线程,该线程一直循环检测是否有鼠标点击,那么这个方式有以下几个缺点:

    1. CPU资源浪费,可能鼠标点击的频率非常小,但是扫描线程还是会一直循环检测,这会造成很多的CPU资源浪费;如果扫描鼠标点击的接口是阻塞的呢?
    2. 如果是堵塞的,又会出现下面这样的问题,如果我们不但要扫描鼠标点击,还要扫描键盘是否按下,由于扫描鼠标时被堵塞了,那么可能永远不会去扫描键盘;
    3. 如果一个循环需要扫描的设备非常多,这又会引来响应时间的问题;所以,该方式是非常不好的。

    方式二:就是事件驱动模型目前大部分的UI编程都是事件驱动模型,如很多UI平台都会提供onClick()事件,这个事件就代表鼠标按下事件。事件驱动模型大体思路如下:

    1. 有一个事件(消息)队列;

    2. 鼠标按下时,往这个队列中增加一个点击事件(消息);

    3. 有个循环,不断从队列取出事件,根据不同的事件,调用不同的函数,如onClick()、onKeyDown()等;

    4. 事件(消息)一般都各自保存各自的处理函数指针,这样,每个消息都有独立的处理函数;如图:

     

    4. 事件驱动处理库

    • select

    • poll

    • epoll

    • libev

    5.效率比较 

    让我们用例子来比较和对比一下单线程、多线程以及事件驱动编程模型。下图展示了随着时间的推移,这三种模式下程序所做的工作。这个程序有3个任务需要完成,每个任务都在等待I/O操作时阻塞自身。阻塞在I/O操作上所花费的时间已经用灰色框标示出来了。

     

    在单线程同步模型中,任务按照顺序执行。如果某个任务因为I/O而阻塞,其他所有的任务都必须等待,直到它完成之后它们才能依次执行。这种明确的执行顺序和串行化处理的行为是很容易推断得出的。如果任务之间并没有互相依赖的关系,但仍然需要互相等待的话这就使得程序不必要的降低了运行速度。

    在多线程版本中,这3个任务分别在独立的线程中执行。这些线程由操作系统来管理,在多处理器系统上可以并行处理,或者在单处理器系统上交错执行。这使得当某个线程阻塞在某个资源的同时其他线程得以继续执行。与完成类似功能的同步程序相比,这种方式更有效率,但程序员必须写代码来保护共享资源,防止其被多个线程同时访问。多线程程序更加难以推断,因为这类程序不得不通过线程同步机制如锁、可重入函数、线程局部存储或者其他机制来处理线程安全问题,如果实现不当就会导致出现微妙且令人痛不欲生的bug。

    在事件驱动版本的程序中,3个任务交错执行,但仍然在一个单独的线程控制中。当处理I/O或者其他昂贵的操作时,注册一个回调到事件循环中,然后当I/O操作完成时继续执行。回调描述了该如何处理某个事件。事件循环轮询所有的事件,当事件到来时将它们分配给等待处理事件的回调函数。这种方式让程序尽可能的得以执行而不需要用到额外的线程。事件驱动型程序比多线程程序更容易推断出行为,因为程序员不需要关心线程安全问题。

    当我们面对如下的环境时,事件驱动模型通常是一个好的选择:

    程序中有许多任务,而且…
    任务之间高度独立(因此它们不需要互相通信,或者等待彼此)而且…
    在等待事件到来时,某些任务会阻塞。
    当应用程序需要在任务间共享可变的数据时,这也是一个不错的选择,因为这里不需要采用同步处理。

    网络应用程序通常都有上述这些特点,这使得它们能够很好的契合事件驱动编程模型。

    事件驱动机制跟消息驱动机制相比

    消息驱动和事件驱动很类似,都是先有一个事件,然后产生一个相应的消息,再把消息放入消息队列,由需要的项目获取。他们的区别是消息是谁产生的

    消息驱动:鼠标管自己点击不需要和系统有过多的交互,消息由系统(第三方)循环检测,来捕获并放入消息队列。消息对于点击事件来说是被动产生的,高内聚。

    事件驱动:鼠标点击产生点击事件后要向系统发送消息“我点击了”的消息,消息是主动产生的。再发送到消息队列中。

     

    事件:按下鼠标,按下键盘,按下游戏手柄,将U盘插入USB接口,都将产生事件。比如说按下鼠标左键,将产生鼠标左键被按下的事件。

    消息:当鼠标被按下,产生了鼠标按下事件,windows侦测到这一事件的发生,随即发出鼠标被按下的消息到消息队列中,这消息附带了一系列相关的事件信息,比如鼠标哪个键被按了,在哪个窗口被按的,按下点的坐标是多少?如此等等。

    注意:

    1. 要理解事件驱动和程序,就需要与非事件驱动的程序进行比较。实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的。早期则存在许多非事件驱动的程序,这样的程序,在需要等待某个条件触发时,会不断地检查这个条件,直到条件满足,这是很浪费cpu时间的。而事件驱动的程序,则有机会释放cpu从而进入睡眠态(注意是有机会,当然程序也可自行决定不释放cpu),当事件触发时被操作系统唤醒,这样就能更加有效地使用cpu.
    2. 再说什么是事件驱动的程序。一个典型的事件驱动的程序,就是一个死循环,并以一个线程的形式存在,这个死循环包括两个部分,第一个部分是按照一定的条件接收并选择一个要处理的事件,第二个部分就是事件的处理过程。程序的执行过程就是选择事件和处理事件,而当没有任何事件触发时,程序会因查询事件队列失败而进入睡眠状态,从而释放cpu。
    3. 事件驱动的程序,必定会直接或者间接拥有一个事件队列,用于存储未能及时处理的事件。
    4. 事件驱动的程序的行为,完全受外部输入的事件控制,所以,事件驱动的系统中,存在大量这种程序,并以事件作为主要的通信方式。
    5. 事件驱动的程序,还有一个最大的好处,就是可以按照一定的顺序处理队列中的事件,而这个顺序则是由事件的触发顺序决定的,这一特性往往被用于保证某些过程的原子化。
    6. 目前windows,linux,nucleus,vxworks都是事件驱动的,只有一些单片机可能是非事件驱动的。


    事件模式耦合高,同模块内好用;消息模式耦合低,跨模块好用。事件模式集成其它语言比较繁琐,消息模式集成其他语言比较轻松。事件是侵入式设计,霸占你的主循环;消息是非侵入式设计,将主循环该怎样设计的自由留给用户。如果你在设计一个东西举棋不定,那么你可以参考win32的GetMessage,本身就是一个藕合度极低的接口,又足够自由,接口任何语言都很方便,具体应用场景再在其基础上封装成事件并不是难事,接口耦合较低,即便哪天事件框架调整,修改外层即可,不会伤经动骨。而如果直接实现成事件,那就完全反过来了。

     

    什么是数据驱动编程

    正题

    作者在介绍Unix设计原则时,其中有一条为“表示原则:把知识叠入数据以求逻辑质朴而健壮”。结合之前自己的一些经验,我对这个原则很有共鸣,所以先学习了数据驱动编程相关的内容,这里和大家分享出来和大家一起讨论。

    核心

    数据驱动编程的核心出发点是相对于程序逻辑,人类更擅长于处理数据。数据比程序逻辑更容易驾驭,所以我们应该尽可能的将设计的复杂度从程序代码转移至数据。

    真的是这样吗?让我们来看一个示例。假设有一个程序,需要处理其他程序发送的消息,消息类型是字符串,每个消息都需要一个函数进行处理。第一印象,我们可能会这样处理: 

    void msg_proc(const char *msg_type, const char *msg_buf) 
    { 
        if (0 == strcmp(msg_type, "inivite")) 
        { 
            inivite_fun(msg_buf); 
        } 
        else if (0 == strcmp(msg_type, "tring_100")) 
        { 
            tring_fun(msg_buf); 
        } 
        else if (0 == strcmp(msg_type, "ring_180")) 
        { 
            ring_180_fun(msg_buf); 
        } 
        else if (0 == strcmp(msg_type, "ring_181")) 
        { 
            ring_181_fun(msg_buf); 
        } 
        else if (0 == strcmp(msg_type, "ring_182")) 
        { 
            ring_182_fun(msg_buf); 
        } 
        else if (0 == strcmp(msg_type, "ring_183")) 
        { 
            ring_183_fun(msg_buf); 
        } 
        else if (0 == strcmp(msg_type, "ok_200")) 
        { 
            ok_200_fun(msg_buf); 
        }
    
        。。。。。。 
        else if (0 == strcmp(msg_type, "fail_486")) 
        { 
            fail_486_fun(msg_buf); 
        } 
        else 
        { 
            log("未识别的消息类型%s\n", msg_type); 
        } 
    } 


    上面的消息类型取自sip协议(不完全相同,sip协议借鉴了http协议),消息类型可能还会增加。看着常常的流程可能有点累,检测一下中间某个消息有没有处理也比较费劲,而且,没增加一个消息,就要增加一个流程分支。

    按照数据驱动编程的思路,可能会这样设计: 

    typedef void (*SIP_MSG_FUN)(const char *);
    
    typedef struct __msg_fun_st 
    { 
        const char *msg_type;//消息类型 
        SIP_MSG_FUN fun_ptr;//函数指针 
    }msg_fun_st;
    
    msg_fun_st msg_flow[] = 
    { 
            {"inivite", inivite_fun}, 
            {"tring_100", tring_fun}, 
            {"ring_180", ring_180_fun}, 
            {"ring_181", ring_181_fun}, 
            {"ring_182", ring_182_fun}, 
            {"ring_183", ring_183_fun}, 
            {"ok_200", ok_200_fun},
    
            。。。。。。 
            {"fail_486", fail_486_fun} 
    };
    
    void msg_proc(const char *msg_type, const char *msg_buf) 
    { 
        int type_num = sizeof(msg_flow) / sizeof(msg_fun_st); 
        int i = 0;
    
        for (i = 0; i < type_num; i++) 
        { 
            if (0 == strcmp(msg_flow[i].msg_type, msg_type)) 
            { 
                msg_flow[i].fun_ptr(msg_buf); 
                return ; 
            } 
        } 
        log("未识别的消息类型%s\n", msg_type); 
    } 

     

    数据驱动优势

    1、可读性更强,消息处理流程一目了然。

    2、更容易修改,要增加新的消息,只要修改数据即可,不需要修改流程。

    3、重用,第一种方案的很多的else if其实只是消息类型和处理函数不同,但是逻辑是一样的。下面的这种方案就是将这种相同的逻辑提取出来,而把容易发生变化的部分提到外面。

    隐含在背后的思想

    很多设计思路背后的原理其实都是相通的,隐含在数据驱动编程背后的实现思想包括:

    1、控制复杂度。通过把程序逻辑的复杂度转移到人类更容易处理的数据中来,从而达到控制复杂度的目标。

    2、隔离变化。像上面的例子,每个消息处理的逻辑是不变的,但是消息可能是变化的,那就把容易变化的消息和不容易变化的逻辑分离。

    3、机制和策略的分离。和第二点很像,本书中很多地方提到了机制和策略。上例中,我的理解,机制就是消息的处理逻辑,策略就是不同的消息处理(后面想专门写一篇文章介绍下机制和策略)。

    数据驱动可以用来做什么:

    如上例所示,它可以应用在函数级的设计中。

    同时,它也可以应用在程序级的设计中,典型的比如用表驱动法实现一个状态机(后面写篇文章专门介绍)。

    也可以用在系统级的设计中,比如DSL(这方面我经验有些欠缺,目前不是非常确定)。

    它不是什么:

    1、 它不是一个全新的编程模型:它只是一种设计思路,而且历史悠久,在unix/linux社区应用很多;

    2、它不同于面向对象设计中的数据:“数据驱动编程中,数据不但表示了某个对象的状态,实际上还定义了程序的流程;OO看重的是封装,而数据驱动编程看重的是编写尽可能少的代码。”

    书中的值得思考的话:

    数据压倒一切。如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明。编程的核心是数据结构,而不是算法。——Rob Pike

    程序员束手无策。。。。。只有跳脱代码,直起腰,仔细思考数据才是最好的行动。表达式编程的精髓。——Fred Brooks

    数据比程序逻辑更易驾驭。尽可能把设计的复杂度从代码转移至数据是个好实践。——《unix编程艺术》作者。

     

    转载自:学时网 » 事件驱动编程、消息驱动编程、数据驱动编程

    展开全文
  • 事件驱动编程

    2014-03-26 13:59:00
    一种语义词语。 动词:代表过去发生的事情。 事件既是技术架构概念,也是业务概念(funny event)。 以事件驱动编程模型称为事件驱动架构
  • 主要介绍了Node.js中的事件驱动编程详解,本文主要讲解理论性知识,如什么是事件驱动编程、什么是闭包、闭包如何帮助异步编程等知识,需要的朋友可以参考下
  • 文章目录一、事件驱动二、事件驱动编程事件驱动和异步IO看图说话讲事件驱动模型三、C/C++实现事件驱动四、常用的C/C++事件驱动库 一、事件驱动 首先我们来看看百度百科的介绍。 所谓事件驱动,简单地说就是你点什么...

    一、事件驱动

    首先我们来看看百度百科的介绍。

    所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数).当然事件不仅限于用户的操作. 事件驱动的核心自然是事件。从事件角度说,事件驱动程序的基本结构是由一个事件收集器、一个事件发送器和一个事件处理器组成。事件收集器专门负责收集所有事件,包括来自用户的(如鼠标、键盘事件等)、来自硬件的(如时钟事件等)和来自软件的(如操作系统、应用程序本身等)。事件发送器负责将收集器收集到的事件分发到目标对象中。事件处理器做具体的事件响应工作,它往往要到实现阶段才完全确定,因而需要运用虚函数机制(函数名往往取为类似于HandleMsg的一个名字)。对于框架的使用者来说,他们能够看到的是事件处理器。这也是他们所关心的内容。

    视图(即我们通常所说的“窗口”)是“事件驱动”应用程序的另一个要元。它是我们所说的事件发送器的目标对象。视图接受事件并能够对其进行处理。当我们将事件发送到具体的视图时,实际上我们完成了一个根本性的变化:从传统的流线型程序结构到事件触发方式的转变。这样应用程序具备相当的柔性,可以应付种种离散的、随机的事件。

    由于Windows本身是基于“事件驱动”模型的。因而在Windows操作系统下实现应用程序框架有相当的便利。在事件驱动程序的基本单元中,事件收集器已经由Windows系统完成;事件发送器也已经由Windows完成了部分内容。之所以是部分而非完全是因为Windows是用C语言实现的,而不是C++。由于没有对象,Windows将事件发送到所谓的“窗口函数”中(尽管不是发送到具体的对象,但应该说这是面向对象方式实现的一个变体)。要感谢Windows做了这件事。确定事件的目标所要做的工作的复杂可能要超出我们的想象。

    可以看到对于事件驱动来说,最重要的是一个事件收集器、一个事件发送器和一个事件处理器。

    二、事件驱动编程

    事件驱动和异步IO

    通常,我们写服务器处理模型的程序时,有以下几种模型:
    (1)每收到一个请求,创建一个新的进程,来处理该请求;
    (2)每收到一个请求,创建一个新的线程,来处理该请求;
    (3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求
    上面的几种方式,各有千秋,
    第(1)中方法,由于创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。
    第(2)种方式,由于要涉及到线程的同步,有可能会面临死锁等问题。
    第(3)种方式,在写应用程序代码时,逻辑比前面两种都复杂。
    综合考虑各方面因素,一般普遍认为第(3)种方式是大多数网络服务器采用的方式

    看图说话讲事件驱动模型

    在UI编程中,常常要对鼠标点击进行相应,首先如何获得鼠标点击呢?
    方式一:创建一个线程,该线程一直循环检测是否有鼠标点击,那么这个方式有以下几个缺点:

    在UI编程中,常常要对鼠标点击进行相应,首先如何获得鼠标点击呢?
    方式一:创建一个线程,该线程一直循环检测是否有鼠标点击,那么这个方式有以下几个缺点:

    1. CPU资源浪费,可能鼠标点击的频率非常小,但是扫描线程还是会一直循环检测,这会造成很多的CPU资源浪费;如果扫描鼠标点击的接口是阻塞的呢?

    2. 如果是堵塞的,又会出现下面这样的问题,如果我们不但要扫描鼠标点击,还要扫描键盘是否按下,由于扫描鼠标时被堵塞了,那么可能永远不会去扫描键盘;

    3. 如果一个循环需要扫描的设备非常多,这又会引来响应时间的问题;
      所以,该方式是非常不好的。

    方式二:就是事件驱动模型
    目前大部分的UI编程都是事件驱动模型,如很多UI平台都会提供onClick()事件,这个事件就代表鼠标按下事件。事件驱动模型大体思路如下:

    1. 有一个事件(消息)队列;

    2. 鼠标按下时,往这个队列中增加一个点击事件(消息);

    3. 有个循环,不断从队列取出事件,根据不同的事件,调用不同的函数,如onClick()、onKeyDown()等;

    4. 事件(消息)一般都各自保存各自的处理函数指针,这样,每个消息都有独立的处理函数;

    img
    事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。另外两种常见的编程范式是(单线程)同步以及多线程编程。

    让我们用例子来比较和对比一下单线程、多线程以及事件驱动编程模型。下图展示了随着时间的推移,这三种模式下程序所做的工作。这个程序有3个任务需要完成,每个任务都在等待I/O操作时阻塞自身。阻塞在I/O操作上所花费的时间已经用灰色框标示出来了。

    img

    在单线程同步模型中,任务按照顺序执行。如果某个任务因为I/O而阻塞,其他所有的任务都必须等待,直到它完成之后它们才能依次执行。这种明确的执行顺序和串行化处理的行为是很容易推断得出的。如果任务之间并没有互相依赖的关系,但仍然需要互相等待的话这就使得程序不必要的降低了运行速度。

    在多线程版本中,这3个任务分别在独立的线程中执行。这些线程由操作系统来管理,在多处理器系统上可以并行处理,或者在单处理器系统上交错执行。这使得当某个线程阻塞在某个资源的同时其他线程得以继续执行。与完成类似功能的同步程序相比,这种方式更有效率,但程序员必须写代码来保护共享资源,防止其被多个线程同时访问。多线程程序更加难以推断,因为这类程序不得不通过线程同步机制如锁、可重入函数、线程局部存储或者其他机制来处理线程安全问题,如果实现不当就会导致出现微妙且令人痛不欲生的bug。

    在事件驱动版本的程序中,3个任务交错执行,但仍然在一个单独的线程控制中。当处理I/O或者其他昂贵的操作时,注册一个回调到事件循环中,然后当I/O操作完成时继续执行。回调描述了该如何处理某个事件。事件循环轮询所有的事件,当事件到来时将它们分配给等待处理事件的回调函数。这种方式让程序尽可能的得以执行而不需要用到额外的线程。事件驱动型程序比多线程程序更容易推断出行为,因为程序员不需要关心线程安全问题。

    当我们面对如下的环境时,事件驱动模型通常是一个好的选择:

    程序中有许多任务,而且…
    任务之间高度独立(因此它们不需要互相通信,或者等待彼此)而且…
    在等待事件到来时,某些任务会阻塞。
    当应用程序需要在任务间共享可变的数据时,这也是一个不错的选择,因为这里不需要采用同步处理。

    网络应用程序通常都有上述这些特点,这使得它们能够很好的契合事件驱动编程模型。

    三、C/C++实现事件驱动

    C/C++实现事件驱动,需要了解函数指针和回调等概念。

    下面放一下之前写的相关的博客:

    C语言注册机制原理及实现

    C 语言跳转表的实现及在嵌入式设备中的应用

    C语言回调函数详解(全网最全)

    当然这些知识语言方面我们需要掌握的特性,要使用事件驱动编程,我们一般会使用事件驱动库。

    四、常用的C/C++事件驱动库

    因为一般事件驱动,都是针对的网络通信。

    下面主要介绍一下libevent、libev、libuv。

    Libevent、libev、libuv三个网络库,都是c语言实现的异步事件库Asynchronousevent library)

    异步事件库本质上是提供异步事件通知(Asynchronous Event Notification,AEN)的。异步事件通知机制就是根据发生的事件,调用相应的回调函数进行处理。

    事件(Event):事件是异步事件通知机制的核心,比如fd事件、超时事件、信号事件、定时器事件。有时候也称事件为事件处理器(EventHandler),这个名称更形象,因为Handler本身表示了包含处理所需数据(或数据的地址)和处理的方法(回调函数),更像是面向对象思想中的称谓。

    事件循环(EventLoop):等待并分发事件。事件循环用于管理事件。

    对于应用程序来说,这些只是异步事件库提供的API,封装了异步事件库跟操作系统的交互,异步事件库会选择一种操作系统提供的机制来实现某一种事件,比如利用Unix/Linux平台的epoll机制实现网络IO事件,在同时存在多种机制可以利用时,异步事件库会采用最优机制。

    技术对比:

    1.libevent

    C语言跨平台,应用最广泛,历史悠久的跨平台事件库。这是一个用纯C写的开源库,属于一个轻量级的网络中间件。其中用到的基本数据结构也是非常巧妙。展现反应堆模型的基本使用方法。不同的事件对应不容的处理方法。I/O 定时 信号。三种事件的处理单独分开,又通过事件驱动融合在一起。

    优先级特性:激活的事件组织在优先级队列中,各类事件默认的优先级是相同的,可以通过设置事件的优先级使其优先被处理。

    libevent在windows下支持iocp,但还不完善。

    2.libev

    设计更简练,性能更好,但因对Windows支持不够好。

    优先级特性:激活的事件组织在优先级队列中,各类事件默认的优先级是相同的,可以通过设置事件的优先级使其优先被处理。

    3.libuv

    libuv是一个支持多平台的异步IO库。它主要是为了node.js而开发的。

    优先级特性:没有优先级概念,按照固定的顺序访问各类事件。

    因libuv为node.js定向开发,普遍应用性不好,且事件触发不可设定优先级,排除。

    4.IOCP

    IOCP是windows下IO事件处理的最高效的一种方式,结合OVERLAPPED IO可以实现真正的完全异步IO。不支持跨平台。

    5.boost::asio

    C++语言跨平台。用bind做回调也并不比虚函数好,看上去灵活了,代价却更高了。不光是运行时的内存和时间代价,编译时间也更长。基于ASIO开发应用,要求程序员熟悉函数对象,函数指针,熟悉boost库中的boost::bind,内存管理控制方面。

    asio是一个高性能的网络开发库,Windows下使用IOCP,Linux下使用epoll。

    展开全文
  • 这里利用队列实现了一个完整的事件驱动编程过程,模拟了银行排队这一离散事件的发生。
  • 《UML状态图的实用C、C++设计:嵌入式系统的事件驱动编程技术(第二版)》《Practical UML Statecharts in C,C++:Event-Driven Programing for Embedded Systems, Second Edition》

    带书签中文合辑下载

    https://download.csdn.net/download/zoomdy/10979234

    压缩包内包含两个独立的pdf文件,分别是中文第2版和英文原书第二版。英文好的同学可以直接阅读英文版,英文不好的同学可以阅读中文版同时参考英文版。

    英文原书第2版

    《Practical UML Statecharts in C,C++:Event-Driven Programing for Embedded Systems, Second Edition》
    Practical UML Statecharts in C,C++, Second Edition

    中文第2版

    《UML状态图的实用C、C++设计:嵌入式系统的事件驱动型编程技术(第二版)》 很可惜,该中文版没有正式出版。

    UML状态图的实用C、C++设计:嵌入式系统的事件驱动型编程技术(第二版)

    展开全文
  • 事件驱动编程的分类和3种具体实现

    千次阅读 2019-04-11 22:39:21
    1、观察者模式:java自带观察者模式类,可直接实现,一个事件源发生事件 触发对 应观察者 2、订阅发布模式:订阅端 事件通道 发布端 解耦度高,优选 二、三种实现 1、spring框架实现 自带了事件监听的相关类,是对...
  • 理解Python事件驱动编程(Event Loop)

    千次阅读 2017-09-11 17:42:12
    2年前我学习Python的时候只知道并发编程模型只有多进程和多线程,这两个模型的特点都是交由操作系统调度,无法人为控制,而且短板很明显,上下文切换和创建开销都是问题。后来又听说了Python的协程-用户级线程,可以...
  • 内容索引:VC/C++源码,网络相关,事件驱动,网络,IO,框架 一个高效的基于事件驱动循环的网络IO编程框架,源代码完整。
  • 关于事件驱动编程

    千次阅读 2017-04-21 14:00:06
    关于事件驱动编程全世界最熟悉事件驱动的程序员应该就是前端工程师了,不管是桌面前端还是web前端都是世界上最熟悉事件驱动的,以web前端为例,我们作业面可以不去想什么面向对象编程,什么jQuery框架咋用,但是为按钮,为...
  • 12.队列的应用-事件驱动编程

    千次阅读 2014-05-05 17:27:52
    事件驱动编程简而言之就是应用程序维护一个或多个事件队列,完全以事件队列为主线来设计和编写整个程序。这里利用队列实现了一个完整的事件驱动编程过程,模拟了银行排队这一离散事件的发生。
  • 这是QP(即Quantum Programming)量子化编程技术最重量级的一本教程,由QP的创始人MIRO SAMEK编写,英文原版名:《MIRO SAMEKPractical UML Statecharts in C/C++, Second Edition: Event-Driven Programming for ...
  • QP量子编程 UML状态图的实用c/c++设计 嵌入式系统的事件驱动编程技术 中文第二版 完整版
  • 采用基于事件驱动模型进行程序设计,其实现步骤包括以下5个步骤 (1)定义事件相关信息类。 (2)在事件发布者类(事件源)中声明事件,并声明一个负责触发事件的方法。 (3)在事件接收者类中声明事件产生时调用...
  • python下的事件驱动编程

    千次阅读 2013-03-06 17:03:35
    最近用python写一个网络服务的模拟测试程序,先是用同步socket实现了一个简单的server,后来发现要没法添加定时器来定时处理一些任务,于是网上搜索python的异步...我写的模拟测试程序只使用了libevent的事件驱动,下
  • 并发,同步,异步以及事件驱动编程的相关技术   前言   这篇文章的存在主要是因为本屌才疏学浅,会的东西实在有限,作为本屌的学习之用,如果有前辈能指正一二,本屌将不胜感激!因为本屌一直觉得代码还有API...
  • 部分摘自 ... ... 事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。另外两种常见的编程范式是
  • ASP.NET 2005第五节 事件驱动编程与回送 视频教学
  • 事件驱动模型

    千次阅读 2020-05-22 00:00:52
    事件驱动模型的概念、作用、实现思路以及几种不同的实现方式。
  • 事件驱动的详解

    万次阅读 多人点赞 2019-01-21 14:58:58
    事件驱动和异步IO 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求; (2)每收到一个请求,创建一个新的线程,来处理该请求; (3)每收到一个请求,...
  • 注:因为这个暑假做了一个ASP.NET的项目(WebForms模式),暑假期间太忙没有来得及整理,现在统一梳理下知识(有些我认为可以跟HTML共通的...当时我入门看的书有:ASP.NET 1.1入门经典-Visual C#.NET 2003编程篇 ASP.
  • QP状态机 第2版 中文 嵌入式系统的事件驱动编程技术第二版
  • 这年头nodeJS真是如日中天啊,学前端的要是不知道nodeJS,都不好意思说自己和懂点代码的美工有啥区别,谈到nodeJS就不得不先聊聊它的事件驱动编程风格。究竟什么是事件驱动编程风格呢?在传统编程中,i/o操作和本地...
  • 1、传统的编程模式 2、事件驱动模型 3、第三种就是协程、事件驱动的方式,一般普遍认为第(3)种方式是大多数网络服务器采用的方式 1、创建一个线程循环检测是否有
  • UML状态图 实用C++设计嵌入式系统事件驱动编程技术

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 520,305
精华内容 208,122
关键字:

事件驱动编程

友情链接: Closed loop ID.zip