Son*_*low -1 c++ interrupt turbo-c++ low-level
我正在尝试使用 Turbo-C++ 同时获得鼠标和键盘输入。
我想使用两个函数。第一个函数是main可以接受键盘输入或调用该delay函数dos.h以暂时停止main().
第二个函数处理鼠标输入:
void mouse()
{
union REGS in,out;
in.x.ax=1; // Show mouse pointer
int86(0x33,&in,&out); //interrupt call
while(1)
{
//print the location whenever it changes (not required)
}
}
Run Code Online (Sandbox Code Playgroud)
如果我正确理解了这个问题,那么您正在编写一个可以在 16 位 MS-DOS 下在 DosBox 中运行的程序。该程序预计会响应鼠标和键盘输入。它可能还想在等待输入时执行一些计算。
最简单和最直接的解决方案是使用polling,这意味着您坐在一个循环中,询问键盘和鼠标是否有新的输入要响应。在伪代码中:
while (true) {
while (keyboard_has_activity()) {
process_keyboard_input();
}
while (mouse_has_activity()) {
process_mouse_input();
}
do_other_computation_for_a_short_time();
}
Run Code Online (Sandbox Code Playgroud)
怎么写keyboard_has_activity?你提到kbhit从conio.h在评论; 那应该工作。您还可以使用较低级别的中断(尽管我不知道有什么理由不使用kbhit)。
注意:process_keyboard_input应该只读取当前可用的字符数。如果您的程序需要等待用户按 Enter,那么您必须将输入的字符存储在(例如)数组中,直到您真正看到 Enter 键,然后立即处理所有输入。
怎么写mouse_has_activity?据我所知,您必须使用INT 0x33例程来查询当前鼠标状态并将其与上次调用时的状态进行比较。
怎么写do_other_computation_for_a_short_time?您必须在算法中设计某种时间限制。例如,如果您正在编写国际象棋引擎,它会在每次(比如)棋盘评估后检查时钟,并在必要时停止,以便您可以轮询输入。当算法停止时,它必须在数据结构中记住它所在的位置,以便以后可以从该点恢复。一个常见的策略是维护一个工作列表:一个仍然需要完成的计算部分的列表。这是协作多任务处理的一种形式。
在任何情况下,您都希望时间限制不超过大约 10 毫秒,否则您可能会错过鼠标点击(用户可以在您注意到之前按下并释放按钮)。
这个解决方案很简单,但不一定是最有效的,并且由于上述问题,如果时间限制太长,就会丢失鼠标点击,因此可能不可靠。
另一种方法是挂钩低级键盘和鼠标中断。这样,您安装的代码仅在触摸输入设备时运行,效率更高。然而,也有很多很难得到正确的,适用于各种原因,包括你有在什么时候被中断一段代码做一点控制。
在这种环境下,尝试将程序组织为两个线程(鼠标和键盘)并同时运行两个功能是不切实际的。DOS 没有线程设施,我不知道有什么方法可以在不基本上重写操作系统的情况下添加它们。相反,您需要从一个控制线程中完成所有工作。
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |