最近我一直在研究编程中并发的基本概念。我脑海中浮现的一个想法是键盘上的同步输入。在编程中,方法或函数通过事件监听器调用,该事件监听器每次只传递一个按键。程序员必须以某种方式编写代码来处理同时/多个按键。我想知道硬件如何处理“真正同时”的输入。是否有某种机制可以自动按特定顺序对感知到的输入进行优先排序?
答案1
回答您关于键盘输入的具体问题。计算机通过串行链路接收按键,因此按键不会同时接收,而这些按键必须是同时接收的 -呃- 连续。
键盘本身内有一个小型处理器,它读取按键并通过串行链路将其发送到计算机。让我们考虑这样一种情况,有人设法“同时”按下两个键(无论这在时间精度方面实际上意味着什么)。键盘处理器正在扫描为其提供按键的数字输入矩阵。由于它扫描了所有按键,它总是会先看到一个按键,然后再看到另一个按键。即使这次扫描需要几微秒,一次按键也会先于另一次按键被检测到。
确实有可能,由于这种扫描,两次压榨可能非常接近,但第二次压榨会首先被看到。
在实时过程控制的更一般领域中,很可能采用中断机制,即输入中断处理器以通知其事件。同样,即使事件不能在时间上分开,一个中断也会先于另一个中断到达处理器。
编写良好的事件驱动软件必须考虑到这样的事实:两个事件可能被检测到非常接近,但实际上可以以相反的顺序被看到。
在 I/O 处理器使用有效聚合输入的协议向控制器计算机报告的情况下,可以发现其他排序问题。
综上所述,真正能做到同时输入吗——不能。
答案2
每次按下或释放按键都会通过 USB 电缆从键盘传输到计算机,因此键盘无法发送真正的同时按键操作。键盘只会在按下或释放按键时发送消息。如果在最后按下的按键的“按键释放”消息之前收到一条“按键按下”消息,计算机将告知应用程序按下了两个按键。