事件驱动机、消息驱动对比

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

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

1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较。实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的。早期则存在许多非事件驱动的程序,这样的程序,在需要等待某个条件触发时,会不断地检查这个条件,直到条件满足,这是很浪费cpu时间的。而事件驱动的程序,则有机会释放cpu从而进入睡眠态(注意是有机会,当然程序也可自行决定不释放cpu),当事件触发时被操作系统唤醒,这样就能更加有效地使用cpu.

2.再说什么是事件驱动的程序。一个典型的事件驱动的程序,就是一个死循环,并以一个线程的形式存在,这个死循环包括两个部分,第一个部分是按照一定的条件接收并选择一个要处理的事件,第二个部分就是事件的处理过程。程序的执行过程就是选择事件和处理事件,而当没有任何事件触发时,程序会因查询事件队列失败而进入睡眠状态,从而释放cpu。

3.事件驱动的程序,必定会直接或者间接拥有一个事件队列,用于存储未能及时处理的事件。

4.事件驱动的程序的行为,完全受外部输入的事件控制,所以,事件驱动的系统中,存在大量这种程序,并以事件作为主要的通信方式。

5.事件驱动的程序,还有一个最大的好处,就是可以按照一定的顺序处理队列中的事件,而这个顺序则是由事件的触发顺序决定的,这一特性往往被用于保证某些过程的原子化。

6.目前windows,linux,nucleus,vxworks都是事件驱动的,只有一些单片机可能是非事件驱动的。

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

C# 什么是【事件驱动】相关推荐

  1. 由Node.js事件驱动模型引发的思考

    引言 近段时间听说了Node.js,很多文章表述这个事件驱动模型多么多么优秀,应用在服务器开发中有很大的优势,本身对此十分感性去,决定深入了解一下,由此也引发了一些对程序设计的思考,记录下来. 什么是 ...

  2. 微服务系列(五):事件驱动的数据管理

    编者的话|本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第三篇描述了微服务架构模块 ...

  3. Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)

    一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 1 简单的启动线程语法 2 def run(na ...

  4. golang-实现自己的事件驱动

    golang实现自己的事件驱动 众所周知,go中的异步操作都已经封装在了运行时的过程中,有关socket的网络的异步操作都封装到了go的netpoll中,从而简化了编程形式.本文也就根据evio库总结 ...

  5. 网关技术选型,为什么选择 Openresty ?事件驱动、协程...

    今天跟大家聊下关于网关的话题 互联网公司,不论体量大小如何,其内部的技术架构基本都是相似的,体现在以下几个方面: 数据量过大,如何定制化存储 访问量高了,如何集群化部署,流量负载均衡 响应速度慢了,如 ...

  6. android 事件驱动编程,跟我学android之四 事件驱动模型

    Android事件驱动模型需要深刻学习和理解,事件驱动模型三要素如下: 事件驱动模型事件源:事件的制造者,如:按钮通常会拥有注册和取消监听器的功能监听器:事件的接收者,通常是自己编写的类的对象一个实现 ...

  7. java事件驱动模型_Spring事件驱动模型详解

    事件驱动模型简介 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型:理解它的几个关键点:首先是一种对象间的一对多的关系:最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方): 当 ...

  8. 【本人秃顶程序员】使用Spring Cloud Stream和RabbitMQ实现事件驱动的微服务

    ←←←←←←←←←←←← 快!点关注 让我们展示如何使用Spring Cloud Stream来设计事件驱动的微服务.首先,Spring Cloud Stream首先有什么好处?因为Spring AM ...

  9. Redis事件驱动库转

    本文转自:http://www.cnblogs.com/wankaizhang/archive/2010/12/27/1918111.html 事件驱动的编程方式已经很普及了,原因自然是互联网的疾速膨 ...

  10. (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)决了当时的问题,那时LZ接触JAVA刚几个月,比葫芦画瓢的用了观察者模式。...

    本章我们讨论一个除前面的单例以及代理模式之外,一个WEB项目中有可能用到的设计模式,即观察者模式. 说起观察者模式,LZ还是非常激动的,当初这算是第一个让LZ感受到设计模式强大的家伙.当初LZ要做一个 ...

最新文章

  1. eplan和西门子plc的对接_玩转西门子全集成自动化之TIA Selection Tool
  2. windows python MySQL-python安装过程
  3. leetcode算法题--买卖股票的最佳时机 II
  4. 开发者成功使用机器学习的十大诀窍
  5. Android开发实例之多点触控程序
  6. 端午将至……想和程序猿Coding个粽子行不行?
  7. 1.关于python
  8. 开始 Scrum 3: Values of Scrum
  9. docker多个容器一起打包_如何实现多个docker容器同时执行一条命令?
  10. 【转】socket提交http表单 [C++]
  11. JavaWeb项目自动部署,持续集成
  12. 微信名片、公众号二维码美化生成器!
  13. 为什么计算机软件比一般作品较多,插画-从入门到进阶的小心得
  14. arcgis发布服务后符号字体丢失解决办法
  15. python 使用 python-socketio 400 错误
  16. ROCBOSS开源微社区轻论坛类源码
  17. [1-3] 把时间当做朋友(李笑来)Chapter 3 【提高心智,和时间做朋友】 摘录
  18. 微信麻将连接服务器失败,微乐麻将授权失败是怎么回事?微乐麻将怎么用微信登录?...
  19. 三分钟了解LAP Framework编程框架
  20. 用python自动发微博

热门文章

  1. 考研计算机网络比较难还是数据结构,2015考研:历年计算机试卷结构与难度分析...
  2. Kafka 安装和搭建 (一)
  3. GitLab 自动触发 Jenkins 构建
  4. 好文推荐 | 分布式锁用Redis好,还是Zookeeper好?
  5. 如何构建一套高性能、高可用性、低成本的视频处理系统?
  6. 详解MySQL基准测试和sysbench工具
  7. 面试官:new一个对象的过程中发生了什么
  8. 面试官问,为什么建议MySQL列属性尽量用 NOT NULL ?
  9. JAVA线程间协作:Condition
  10. 打造极致体验:字节跳动亿级 DAU 背后的音视频技术最佳实践