0

我正在开发一个基于文本的游戏,它使用 GUI 作为输入和输出的“控制台”。我的目标是,当游戏要求时,将我在 JTextArea 中键入的命令提交给另一个方法。

为此,我提出了这个想法:当user.readLine()被调用时,它会循环直到 GUI 接收到一个动作事件。此事件的检测是通过翻转一个名为 的布尔值来完成的commanded,在 actionevent 的方法中切换。readLine()然后在此时中断循环并返回刚刚输入的文本,然后将布尔值翻转回来。有趣的是,这只适用于我 在翻转布尔值之前添加 aSystem.out.println();或 a ......Thread.sleep(1);

readLine()方法涉及大量循环,大括号之间没有代码,因为它等待动作事件。将其视为“短路”和应避免的事情是错误的吗?代码如下。谢谢!

命令输入.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 回答
1

阅读这篇文章,了解如何使用事件驱动编程来解决您的问题。简而言之,您的方法效率低下并且无法很好地扩展

于 2014-07-04T23:36:25.583 回答