>我有一个 c++ 库,其中包含一个实现自定义编程语言的虚拟机(称为"VM")的类。这种语言有一些不同的指令可以执行,其中有"从输入中读取值"指令。VM 可以在两种模式下运行:逐步执行单个指令(直到机器完成)或一次执行所有指令。它还可用于两个应用程序:控制台和 GUI 应用程序。
到目前为止,我只有一个控制台应用程序。当执行"从输入读取值"指令时,它只是使用 std::cin 来读取值,因此虚拟机会停止,直到提交输入。当我尝试为 VM 创建 GUI 时,会出现此问题。我将使用典型的文本输入而不是std::cin
。
问题是:您认为从执行指令的角度对此类问题进行建模的最佳方法是什么?执行"从输入读取值"指令时,VM 应如何行为?在用户单击"执行单个指令"之前,他不知道它将是哪种指令,因此他无法在执行指令之前提交输入。
我正在考虑向 VM 添加新的状态属性:{working|awaiting_input}
.在"读取"指令运行时,计算机应挂起,直到获得输入。当GUI层从用户那里获取输入时,它会调用VM的新方法passInput(inputValue)
该方法,该方法还会唤醒VM(完成单个指令或所有指令)。你能想到一个更简单的解决方案(例如,不添加状态属性)吗?
第一步是将你的"输入"从 VM 引擎的一个组成部分中分离出来[现在听起来像是这样],这样当你获得"从输入中读取值"时,你只需调用一个"do_input"函数 - 在"user_interface"类中实现的虚拟函数 - 可以是UI或iostream。
无论是单站运行还是"全速"运行都不应该有任何区别,"指令"在收集输入之前不会完成,对吧?
现在,GUI可能非常棘手,因为它往往是事件驱动的,而输入只是另一个事件。但是,如果您将"do_input"函数实现为仅在读取输入时返回的函数,那么这没什么大不了的。您只需要一些(部分)窗口作为"这是您输入输入的地方",用户必须键入一些内容。当用户按回车键(或单击按钮等)时,您就完成了输入。
您可能还希望拥有一种从文件中读取输入的模式... ;)
它可能比我刚才描述的要复杂一些,但不应该比这更多。[我以前在指令模拟器中做过类似的事情,其中一条指令可以有效地花费"无限"的时间,因为它等待输入]。