我一直在研究C语言中的事件驱动编程,而且该语言似乎没有对它的支持。这让我开始怀疑事件驱动编程的本质。如果说事件处理程序基本上生成一个等待I/O响应并设置变量的线程,这是正确的吗?或者这个过程有什么更复杂的。
发布于 2014-02-24 19:46:51
事件驱动体系结构仅仅意味着主循环AKA事件循环对程序处理的数据不太了解。它只知道,它可以为数据分派正确的事件。
例如,如果事件是由来自套接字的数据触发的,那么所有事件循环需要知道的是,当数据来自特定的套接字时,调用什么回调。
通常,事件循环位于某些库中,如利贝特。因此,应用程序代码由仅由库中的事件循环调用的设置代码和事件处理程序组成。
因为您提到了线程:典型的简单事件驱动应用程序是单线程的。当每个事件处理程序或回调被调用并返回时,都会尽其所能地执行它的任务。阻塞或等待或睡觉是一个大不不,它将阻止所有其他事件!
当有一些需要很长时间的处理时,通常使用线程。如果它是在带有事件循环的主线程中完成的,那么长的操作就必须被切成小块,这样其他的事件也可以被处理。因此,更简单的做法是有一个工作线程,它可以在不干扰事件处理的情况下进行处理,然后在完成时为主事件循环生成事件。
使用线程的另一种情况是,当存在必须阻塞的东西时。例如,它可能是其他库,它只提供阻塞API。如果要从主线程事件循环中使用该API,它将阻止其他事件。解决方案是使用来自另一个线程的库,该线程可以阻塞,然后在应用程序的其他部分感兴趣时为主事件循环生成事件。
但从某种意义上说,事件驱动架构与多线程体系结构是完全相反的:
当然,一个复杂的应用程序可以在不同的线程中有多个事件循环,也可以有只做单一事情的线程,所以可以将它们混合在一起。
发布于 2015-06-08 10:43:33
事件循环库可以是单线程的,如果它使用一些多路复用工具来等待几个事件、输入(和输出,例如在某个管道或套接字上写入一些字节的能力和准备性)。
在Linux和POSIX系统上,您可以使用一些多路复用的syscall,比如民意测验(2)或选择(2)。因此,您可以拥有单线程事件循环库,并且(至少在历史上,例如在上个世纪)几个事件循环库(如利别夫、利贝特、GTK的滑翔 )都是-or --单线程(因此它们不会产生新线程)。
即使是最近的GUI框架,如Qt5或GTK3 3/Gnome,仍然需要(在Linux上)图形用户代码在主线程中。
你也可以有一些事件循环,即使在那些驱动微控制器的独立C程序中也是如此.然后,他们会使用一些代码(可能在程序集中)来等待事件或中断,等等。
https://softwareengineering.stackexchange.com/questions/230180
复制相似问题