首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件驱动编程?

事件驱动编程?
EN

Software Engineering用户
提问于 2014-02-24 19:39:19
回答 2查看 7.9K关注 0票数 0

我一直在研究C语言中的事件驱动编程,而且该语言似乎没有对它的支持。这让我开始怀疑事件驱动编程的本质。如果说事件处理程序基本上生成一个等待I/O响应并设置变量的线程,这是正确的吗?或者这个过程有什么更复杂的。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2014-02-24 19:46:51

事件驱动体系结构仅仅意味着主循环AKA事件循环对程序处理的数据不太了解。它只知道,它可以为数据分派正确的事件。

例如,如果事件是由来自套接字的数据触发的,那么所有事件循环需要知道的是,当数据来自特定的套接字时,调用什么回调。

通常,事件循环位于某些库中,如利贝特。因此,应用程序代码由仅由库中的事件循环调用的设置代码和事件处理程序组成。

因为您提到了线程:典型的简单事件驱动应用程序是单线程的。当每个事件处理程序或回调被调用并返回时,都会尽其所能地执行它的任务。阻塞或等待或睡觉是一个大不不,它将阻止所有其他事件!

当有一些需要很长时间的处理时,通常使用线程。如果它是在带有事件循环的主线程中完成的,那么长的操作就必须被切成小块,这样其他的事件也可以被处理。因此,更简单的做法是有一个工作线程,它可以在不干扰事件处理的情况下进行处理,然后在完成时为主事件循环生成事件。

使用线程的另一种情况是,当存在必须阻塞的东西时。例如,它可能是其他库,它只提供阻塞API。如果要从主线程事件循环中使用该API,它将阻止其他事件。解决方案是使用来自另一个线程的库,该线程可以阻塞,然后在应用程序的其他部分感兴趣时为主事件循环生成事件。

但从某种意义上说,事件驱动架构与多线程体系结构是完全相反的:

  • 在简单的多线程体系结构中,每个线程都在等待一种事物的处理(等待条件、阻塞队列或阻塞套接字读取或其他任何东西,可能会有超时来定期检查某件事情),然后进行处理,可能会向其他线程发送信号,然后返回等待。一个线程做一件事,每种不同类型的事情都有一个线程。
  • 在事件驱动的体系结构中,只有一个主事件循环(通常来自库),它等待所有类型的事件和调用处理程序,它们都位于同一个线程中。每个线程都是由一个线程完成的,并且每个不同的事情都有一个非阻塞的事件处理程序。这样做的好处是,不需要同步,因为它都在一个线程中,这样就避免了太常见的多线程错误,使代码更简单,避免了同步开销。缺点是没有利用多个CPU核,如果开发人员粗心,就有阻塞事件循环的风险。

当然,一个复杂的应用程序可以在不同的线程中有多个事件循环,也可以有只做单一事情的线程,所以可以将它们混合在一起。

票数 14
EN

Software Engineering用户

发布于 2015-06-08 10:43:33

事件循环库可以是单线程的,如果它使用一些多路复用工具来等待几个事件、输入(和输出,例如在某个管道或套接字上写入一些字节的能力和准备性)。

在Linux和POSIX系统上,您可以使用一些多路复用的syscall,比如民意测验(2)选择(2)。因此,您可以拥有单线程事件循环库,并且(至少在历史上,例如在上个世纪)几个事件循环库(如利别夫利贝特、GTK的滑翔 )都是-or --单线程(因此它们不会产生新线程)。

即使是最近的GUI框架,如Qt5或GTK3 3/Gnome,仍然需要(在Linux上)图形用户代码在主线程中。

你也可以有一些事件循环,即使在那些驱动微控制器的独立C程序中也是如此.然后,他们会使用一些代码(可能在程序集中)来等待事件或中断,等等。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/230180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档