0

入力と出力の「コンソール」として GUI を使用したテキスト ベースのゲームに取り組んでいます。私の目的は、ゲームが要求したときに、JTextArea に入力したコマンドを別のメソッドに送信することです。

user.readLine()呼び出されると、GUI がアクション イベントを受け取るまでループします。このイベントの検出はcommanded、 actionevent のメソッドで切り替えられた というブール値の反転によって達成されます。readLine()次に、この時点でループを中断し、入力されたばかりのテキストを返し、ブール値を元に戻します。興味深いことに、これは 、ブール値を元に戻す前にaSystem.out.println();または aを追加した場合にのみ機能します...Thread.sleep(1);

このreadLine()メソッドはアクション イベントを待機するため、中かっこの間にコードを入れずに多くのループを実行します。これを「短絡」であり、避けるべきものと考えるのは間違っていますか? コードは以下です。ありがとう!

CommandInput.java:

public void waitForCommand() {
    try {
        processCommand(Parasite.user.readLine().toLowerCase());
    } catch (Exception e) {
        System.err.println(e);
    }
}

UI.java (Parasite.user として初期化):

boolean commanded= false;
String command = "";

public final String readLine()
{
    while(commanded == false)
    {
       System.err.print(command);
    }
    System.out.println("Submitting Command");
    commanded = false;
    return command;       
}

private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {                                            

    commanded=true;
    command=jTextField1.getText();
    System.err.println(jTextField1.getText());  
    jTextField1.setText("");

} 
4

2 に答える 2

1

短絡的なこと: 次のようなループ以外の言葉であまり機能しないループ:

while(true) {}

あまりCPUフレンドリーではありません。次のようなものの方がはるかに優れています。

while(true) {
    Thread.yield();
}

これは、CPU に対して、このスレッドを今すぐ停止できるため、他のスレッドをすぐに実行できることを示しており、スレッド キューで下に移動します。これを行うと、それほど精度が失われることはありませんが、すべての CPU を使用できなくなります。(詳細については、こちらをご覧ください: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#yield() )

だからあなたの場合:

while(commanded == false)
{
   System.err.print(command);
    Thread.yield();
}
于 2014-07-04T23:26:53.527 に答える