我们如何同时完成两项工作?
在连续显示某些内容时,程序应该等待另一方的按键事件。
我想为我的班级项目开发一个简单的游戏。在C ++中,我使用了不同的线程,用于显示输入事件。
如何在连续显示内容时获得按键值?
可以使用中断吗?如果是,那么我们如何使用它呢? INT
?
我正在使用Masm 32位或16位
答案 0 :(得分:0)
int
同步生成中断。它是您用于软件生成中断的内容。
你"得到"如果您的代码在环0中运行(即内核模式,在16位实模式下正常但在32位保护模式下不正常),则通过安装中断处理程序来中断。
或(as Ped7G says)您可以使用非阻塞int 21h
或int 10h
系统调用每个绘制循环轮询一次按键。
在完整的多任务操作系统(例如Windows NT或更高版本,或Linux或OS X,但不是 DOS)下运行时,您唯一的选择是询问(通过使用系统调用)操作系统通知您的异步事件进程。这基本上与汇编语言无关,因为您无法直接访问硬件,并且操作系统会控制所有中断处理程序。即你完全按照与C相同的方式进行操作,同一系统调用具有相同的参数。唯一的区别是你推动ecx
/ push ebx / push eax / call foo
/ add esp, 12
而不是foo(a,b,c)
。
例如,您可以启动另一个线程并让它调用wait-for-key系统调用(因此它会阻塞),然后设置一个标志(主线程偶尔会轮询),或者让线程等待按键实际上处理了按键本身。
您也可以让密钥等待线程向主线程发送某种信号,这几乎就像用户空间中的中断处理程序。除了信号是纯粹的软件发明之外,并且它由操作系统来传递信号"通过使主线程执行它安装的信号处理函数。 (IDK如果Windows有一些与POSIX信号完全相同的东西,那么假设您使用MASM开发Windows可执行文件,这可能不是中断主线程中无限循环的选项。)
其他执行异步I / O的方法也是可能的,例如,在绘制每一帧后,使用非阻塞系统调用对主键进行主线程轮询。
我在这里没有详细介绍,但你应该能够谷歌我使用的一些短语并找到更多。这个问题对于一个特定的答案来说过于笼统,但这就是操作系统机制如何支持这种事情。