multithreading - 如何确保不错过活动
问题描述
假设我有一个执行以下操作的程序:
- 等待按键
- 按下键后,执行复杂查询(需要 10 秒)并打印结果
- 重复
现在,如果我的按键间隔 10 秒,这将不是问题。我如何处理非常接近的按键。更糟糕的是,按键是同时按下的。这些信息一定会丢失吗?我知道线程可能是一种选择,但这样做的一般方法是什么?即使其他代码正在运行并能够在以后处理它,是否可以只存储每个按下的键?
解决方案
中断。通常,计算机为外围设备提供一种机制,通过断言中断请求信号来请求 CPU 的注意。当 CPU 准备好接受中断时,它会通过在某处保存最小状态来响应,然后执行可以查询外围设备的代码,可能从外围接收数据(按键)。
如果您使用的是操作系统,这一切都被内核隐藏,它通常会公开一些机制供您选择如何处理它:
- 排队按键并稍后处理它们。因此,如果我想按该顺序查询 1、3、5,我可以在您进行长时间处理时连续按下这些键并抽根烟。
- 放弃前瞻按键;因此要求用户与糟糕的 UI 交互。搜索“homer Simpson work from home”以了解如何解决此问题。
如果您使用的是操作系统,您可能需要查找各种 ioctl 以启用此行为,使用类似于 curses 的 UI 包或其他。
如果您不使用操作系统,那么您的工作既困难又容易:您必须编写代码来与键盘对话,但实施该策略是找出一些巴洛克式 UI 库的 1/10 工作。
推荐阅读
- java - 在构造立方体和矩形对象期间堆栈溢出
- python - 在答案中加上美元符号
- r - 如何在R中的数据框中添加最后一行作为总计
- algorithm - 无法理解 Dijkstra 的优先级队列实现
- macos - 如何绘制 NSPopupButtonCell 突出显示的图像
- php - 模块中的自定义函数返回页面未找到
- java - 弹跳球不会停在边界 JAVA
- java - Spring Boot 和 Thymeleaf:通过导航栏链接切换页面
- c++ - 为什么 std::source_location 的吸气剂没有标记为 [[nodiscard]]?
- node.js - 使用简单的 nodejs 服务器未定义 CORS 来源