通常,事件处理程序如何工作?


14

这是一个通用主题,事件处理程序如何工作?

这意味着在幕后-创建它们时会发生什么。

我有一个大概的想法-但想确认一下。



出色的观察者模式是我发现的:我已经在网络上阅读了有关此问题的内容,并阅读了有关事件驱动编程的优秀论文。在本文中,它讨论了处理程序设计模式的过程。这样一来,您就有大量的事件到达分派器,然后分派器对该事件进行分析,以确定其事件类型,然后将每个事件发送到可以处理该类型事件的处理程序。
JHarley1年

1
它说明了调度程序如何进行一个无限循环,该循环仅在程序关闭时(例如,使用GUI应用程序)才停止。然后,您如何获得一个观察者模式(或发布/订阅模式),该模式被广泛用于使用GUI框架进行事件驱动的编程,以及它如何按照好莱坞原则“不要打电话给我们,我们会打电话给您”来工作。
JHarley1年

您认为上述解释足够吗?
JHarley1年

这取决于。对于高层次的概述,这很好。但是,对于全面而透彻的解释,请不要。当然,这样的解释可能需要花费很多篇幅,因为这可能很花哨,例如,您可以进入网络与桌面事件之类的东西。
JB King

Answers:


15

在低层,事件处理程序通常通过轮询设备并等待硬件中断来工作。本质上,后台线程在等待硬件中断发生时会阻塞。发生中断时,轮询功能将停止阻塞。然后,应用程序可以找出导致中断的设备句柄以及中断的类型,然后采取相应措施(例如,通过调用事件处理函数)。通常这是在单独的线程中完成的,因此它是异步发生的。

当然,实际实现的方式根据操作系统和设备/输入类型的不同而有很大差异。在UNIX系统上,为套接字,串行或USB端口之类的事件实现事件处理程序的一种方法是通过selectpoll系统调用。一个或多个文件/设备描述符(与设备相关联,例如网络套接字,串行/ USB端口等)传递给poll系统调用-通过低级C API可供程序员使用。当这些设备之一发生事件时(例如,某些数据到达串行端口),轮询系统调用将停止阻塞,然后应用程序可以确定是哪个设备描述符导致了该事件以及它是什么类型的事件。 。

在Windows上,处理方式不同,但是概念基本相同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.