2013-01-31 55 views
0

我有一个C++库,它有一个实现了自定义编程语言的虚拟机(称为'VM')的类。这种语言有一些可以执行的不同指令,其中有“读取输入值”指令。 VM可以以两种模式运行:逐步执行单个指令(直到机器完成)或一次执行所有指令。它也可以用于两个应用程序:控制台和GUI应用程序。从输入设计中读取控制台和GUI应用程序的值(C++)

到目前为止,我只有一个控制台应用程序。当执行“输入读取值”指令时,它只是使用std :: cin读取值,因此虚拟机停止,直到提交输入。当我试图为虚拟机创建一个GUI时,就会出现问题。我将使用典型的文本输入而不是std::cin

现在的问题是:您认为从执行指令的角度来建模这样的问题最好的方法是什么?执行“输入读取值”指令时虚拟机应该如何工作?在用户单击“执行单个指令”之前,他不知道将要执行什么类型的指令,因此在指令执行之前他不能提交输入。

我在考虑给VM添加一个新的状态属性:{working|awaiting_input}。在“读取”指令运行期间,机器应暂停,直到它获得输入。当GUI层获取来自用户的输入时,它会调用虚拟机的新方法,这会额外唤醒虚拟机(以完成单个指令或全部虚拟机)。你能想出一个更简单的解决方案吗(例如不需要添加一个状态属性)?

+0

是的,当确认输入时回调VM(例如用户按下输入文本框内),并让它有正常的消息循环(如WinAPI)。 –

回答

2

第一步是将您的“输入”从VM引擎的一个组成部分[它听起来像是现在]中分解出来,这样当您获得“从输入读取值”时,您只需致电一个“do_input”函数 - 一个在“user_interface”类中实现的虚拟函数 - 可以是UI或iostream。

无论是以单站或“全速”运行都不应该有任何区别,“指令”直到收集输入才完成,对吧?

现在,GUI可能非常棘手,因为它往往是事件驱动的,输入只是另一个事件。但是,如果您将“do_input”函数实现为仅在读取输入时才返回的函数,那么它并不是什么大不了的事情。你只需要一些(部分)窗口作为“这是你输入输入的地方”,用户必须输入一些内容。当用户点击进入(或点击一个按钮等),然后你有完整的输入。

您可能还需要有地方输入从文件中读取的模式...;)

这可能是一个比较复杂一点比我刚才描述的,但不应该是一个巨大的数额比那更多的。 [我之前在指令模拟器中做过类似的事情,其中​​一条指令可以有效地采用“无限”的时间量,因为它等待输入]。

+0

不,你的回答正是我需要的!我找到的最简单的Qt解决方案是创建一个对话框:QInputDialog :: getInteger(0,“Factorial Calculator”,“Factorial2 of:”,1)。所以,而不是std :: cin >> var; stack-> instrPush(var) - 我做stack-> instrPush(QInputDialog :: getInteger(0,“Factorial Calculator”,“Factorial2 of:”,1));谢谢! – ducin

+0

顺便说一句,QInputDialog冻结正常的程序执行,就像Mats提到的那样,所以不需要VM新的状态属性。 – ducin

相关问题