0

カスタムプログラミング言語の仮想マシン(「VM」と呼ばれる)を実装するクラスを備えたc++ライブラリがあります。この言語には、実行可能ないくつかの異なる命令があり、その中には「入力から値を読み取る」命令があります。VMは、2つのモードで実行できます。1つの命令を段階的に実行するか(マシンが完了するまで)、すべての命令を一度に実行します。コンソールとGUIアプリケーションの2つのアプリケーションでも使用できます。

今まで私はコンソールアプリケーションしか持っていませんでした。「入力から値を読み取る」命令が実行されると、std :: cinを使用して値が読み取られたため、仮想マシンは入力が送信されるまで停止しました。この問題は、VMのGUIを作成しようとすると発生します。の代わりに、一般的なテキスト入力を使用しますstd::cin

問題は、命令を実行するという観点から、そのような問題をモデル化するための最良の方法は何だと思いますか?「入力から値を読み取る」命令が実行されたとき、VMはどのように動作する必要がありますか?ユーザーが「単一命令の実行」をクリックする前に、それがどのような命令になるかわからないため、命令が実行される前に入力を送信することはできません。

VMに新しい状態プロパティを追加することを考えていました{working|awaiting_input}。「読み取り」命令の実行中、マシンは入力を取得するまで一時停止する必要があります。また、GUIレイヤーがユーザーからの入力をフェッチすると、VMのpassInput(inputValue)新しいメソッドが呼び出され、VMがさらにウェイクアップします(単一の命令またはすべての命令を終了するため)。より簡単な解決策を考えられますか(たとえば、状態プロパティを追加しないで)?

4

1 に答える 1

2

最初のステップは、「入力」をVMエンジンの不可欠な部分から切り離すことです(現在のように聞こえます)。これにより、「入力からの読み取り値」を取得するときに、「do_input」を呼び出すだけです。 function-「user_interface」クラスに実装された仮想関数-UIまたはiostreamのいずれかです。

シングルストップで実行している場合でも、「フルスピード」で実行している場合でも、違いはありません。入力が収集されるまで、「命令」は完了しません。

現在、GUIはイベント駆動型である傾向があり、入力は単なる別のイベントであるため、非常に扱いにくい場合があります。ただし、「do_input」関数を、入力が読み取られたときにのみ返される関数として実装する場合、それは実際には大したことではありません。「これは入力を入力する場所です」というウィンドウが必要なだけで、ユーザーはそれに何かを入力する必要があります。ユーザーがEnterキーを押す(またはボタンをクリックするなど)と、入力が完了します。

また、入力がファイルから読み取られるモードが必要な場合もあります...;)

おそらく、今説明したよりも少し複雑ですが、それ以上の量になるべきではありません。[以前、命令シミュレーターで同様のことを行いました。1つの命令は入力を待機するため、事実上「無限」の時間がかかる可能性があります]。

于 2013-01-31T12:10:39.557 に答える