首页 > 编程知识 正文

事件驱动与过程驱动,dm9000驱动详解

时间:2023-05-06 07:10:43 阅读:142018 作者:1545

事件驱动和异步IO通常,当服务器编写处理模型的程序时,会出现以下模型:

)1)每次收到请求时,都会创建新的进程来处理该请求;

)2)每次收到请求时,都会创建一个新线程来处理该请求;

)3)每次收到请求时,都会加入事件列表,使主进程可以通过无阻断I/O方式处理请求

上面的几种方式,各有千秋,

在(1)的方法中,由于制作新工艺的开销大,所以服务器的性能会恶化,但实现比较简单。

)第二种方式,因为涉及线程的同步,所以有可能面临死锁等问题。

)第三种方式是,撰写APP二维码时,逻辑比前面两个复杂。

综合考虑各方面的因素,一般来说,第(3)方式被认为是很多网络服务器采用的方式

看图说话事件驱动模型

在UI编程中,经常与鼠标点击相对应,那么首先如何获得鼠标点击呢?

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

1. CPU资源的浪费,鼠标点击的频率可能非常低,但扫描线程一直在循环中被检测到,这会导致很多CPU资源的浪费; 如果扫描和单击鼠标的界面被阻止了呢?

2 .如果堵塞,则会出现以下问题。 除了扫描并单击鼠标外,还会扫描键盘是否被按下。 扫描鼠标时被卡住了,所以可能不会扫描键盘。

3 .如果一个周期扫描的设备非常多,这又会导致响应时间问题;

所以,这种方式非常不好。

方式二:就是事件驱动模型

目前,大多数UI编程都是事件驱动模型,许多UI平台都提供onClick )事件。 此事件表示鼠标按下事件。 事件驱动模型的大致思路如下。

1 .有事件(消息)队列

2 .按下鼠标时,将单击事件(消息)添加到此队列

3 .存在一个循环,用于继续从队列中取出事件,并为每个事件调用不同的函数,如onClick ()、onKeyDown ()

4 .一般情况下,每个事件(消息)都有自己的处理函数指针。 这样,每个消息都有独立的处理函数。

事件驱动编程是编程的一种范式,在其中程序的执行流由外部事件确定。 其特征在于,它包含一个事件循环,在发生外部事件时使用回调机制触发相应的处理。 另外两种常见的编程范式是“单线程”同步和多线程编程。

通过示例比较和比较单线程、多线程和事件驱动的编程模型。 下图显示了随着时间的推移,程序将在这三种模式下执行的任务。 此程序需要完成三项任务,每个任务在等待I/O操作时都会阻止自身。 I/O操作所需的时间用灰色框表示。

在单线程同步模型中,任务按顺序执行。 如果任务因I/O而被阻止,则所有其他任务必须等待,直到完成。 这种明确的执行顺序和序列化处理的行为很容易推断出来。 任务之间没有依存关系,但需要相互等待时,这会不必要地降低程序的执行速度。

在多线程版本中,这三个任务中的每一个都在独立的线程上执行。 这些线程由操作系统管理,可以在多处理器系统上并行处理,也可以在单处理器系统上交错执行。 这样,在一个线程被资源阻止的同时,其他线程可以继续运行。 此方法比完成具有类似功能的同步程序更有效,但程序员必须编写代码以保护共享资源,避免被多个线程同时访问。 多线程程序必须使用锁定、可重入函数、线程本地存储或其他机制来解决线程安全问题,如果安装不当,会出现微妙而痛苦的bug,因此更难推测

事件驱动程序交替执行三个任务,但仍在控制一个独立的线程。 如果要处理I/O等昂贵操作,请在事件循环中注册回调,并在I/O操作完成后继续。 回调描述如何处理事件。 事件循环轮询所有事件,并将其指派给回调函数以在事件到达时等待处理事件。 这样就可以尽可能地运行程序,而不需要额外的线程。 事件驱动程序比多线程程序更容易估计行为。 因为程序员不需要在意线程安全问题。

事件驱动模型适用于面临以下环境:

程序有很多任务,…

任务之间是高度独立的,不需要相互通信,也不需要相互等待。 然后…

等待事件到来时,某些任务将被阻止。

这也适用于APP应用程序需要在任务之间共享可变数据的情况。 因为不需要采用同步处理。

通常,网络APP应用程序具有这些特征,可以很好地匹配事件驱动的编程模型。

----------------

作者: rainyday66

来源: CSDN

原文: 3359 blog.csdn.net/QQ _ 34173549/article/details/80212101

声明:本文为博主原创文章。 转载请附上博文链接!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。