我是计算机科学的学生,并且在计算机程序运行时已经学习了许多关于“引擎盖下”发生的基本概念。但最近我意识到我不明白软件事件如何有效运作。
在硬件方面,这很容易:代替处理器“忙着等待”以查看是否发生了某些事情,组件发送了一个中断请求。
但是,这是如何工作的,例如,鼠标悬停事件?我的猜测如下:如果鼠标发送信号(“移动”),操作系统会计算其新位置p,然后检查屏幕上正在绘制的程序,告诉程序位置p,然后程序本身检查什么object位于p,检查是否有任何事件处理程序与所述对象关联并最终触发它们。
这对我来说听起来非常低效,因为微小的鼠标移动相当于很多cpu上下文切换(我学到的相对昂贵)。然后有许多后台应用程序也可能想要自己做一些事情。
我的直觉在哪里失败了?我意识到即使是“慢速”的500MHz处理器每秒也能完成5亿次操作,但对于这样一个简单的事件来说,它似乎仍然有用。
提前致谢!
答案 0 :(得分:5)
考虑网络数据包等事件,因为它们通常由类似的机制处理。现在想想,你的鼠标每秒最多发送几百个数据包,每个数据包大约6个字节。与现代机器的带宽能力相比,这没什么。
事实上,你可以创建一个响应式GUI,其中每个鼠标运动在大约20年前构建的硬件上实际上发送了一个网络数据包(86字节包括标题):X11,Linux和大多数其他Unix的基本GUI机制,可以做确切地说,并且经常在80年代末和90年代初使用这种方式。当我第一次使用GUI时,它就是这样,虽然现在的标准不是很好,但鉴于它在20 MHz机器上运行,它确实可用。
答案 1 :(得分:2)
我的理解如下:
每个应用程序/窗口都有一个由OS中断填充的事件循环。 鼠标移动将进入那里。 据我所知,所有窗口都有一个单独的队列/进程(在3.1以后的窗口中)
每个窗口都有控件。 窗口会将此事件冒泡到控件中。 控件将确定该事件是否适合他。
因此,没有必要“计算”在鼠标光标下绘制的项目。 窗口,然后控件将确定事件是否适合他们。
答案 2 :(得分:0)
您根据什么标准确定它太多了?它需要的工作量也是如此之多。鼠标事件发生在毫秒范围内。将其传递给处理程序代码所需的工作可能以微秒为单位进行测量。这不是问题。
答案 3 :(得分:0)
你是非常正确的 - 虽然鼠标事件以固定的速率发生(例如,linux上的USB鼠标默认情况下会为你提供125次事件 - 实际上并不是很多),而操作系统或应用程序可能会进一步合并鼠标事件,这些事件在发送之前在时间或位置上接近处理