2

我正在尝试使用一个单独的线程来通过 Java 中的嵌套 for 循环(以避免冻结 UI,并使事情变得更简单):

public class scan2D extends Thread{
    public void run(){
        float data;
        for (int y = 0; y<GUI.max_y; y++) {
            for (int x = 0; x<GUI.max_x; x++) {
                GUI.model.set(GUI.edaq.getdata());
            } 
        }
        GUI.model.save();
    }
}

scan2d 对象是在 GUI 对象中创建的,通过按下 GUI 的启动按钮来启动。一切正常,除了“模型”对象只更新一次,最后由所有数据更新,而不是一个接一个。我希望从“edaq”读取数据并发送到模型后立即更新它。模型由视图观察。如何使更新即时?

更新 感谢您的所有帮助建议和意见!抱歉,我没有包含所有明显导致问题的代码。我是初学者。我做了一个简化的、最小的“工作”示例,它也显示了症状:

package test;

public class GUI {
    static Model model;
    static scan2D scan2d;
    public GUI() {
        model = new Model();
        scan2d = new scan2D();
        scan2d.start();
    }
    public static void main(String[] args) {
        new GUI();
    }
}

class Model {
    public void set(int data)
    {
        System.out.print(data);
    }
}

public class scan2D extends Thread {
    public void run(){
        int data;
        for (int y = 0; y<=10; y++) {
            for (int x = 0; x<=10; x++) {
                try {Thread.sleep(100);}
                catch(InterruptedException ex){}
                GUI.model.set(x+y);
            }
        }
    }
}

当我尝试延迟 100 毫秒时,我会同时在 netbeans 输出窗口的末尾显示所有数据。当我使用 1000 秒时,它可以工作,数据会在输出中一一显示。只是显示问题吗?

4

3 回答 3

0

您的 GUI 如何观察模型的变化?我假设您必须通知该人执行更新。此通知必须在事件分派线程上执行。

影响 gui 的一切都必须发生在 gui 的线程上 - 例如通过

                    SwingUtilities.invokeAndWait(new Runnable() {
                        public void run() {
                            // update guy
                        }
                    });
于 2013-08-20T21:03:09.730 回答
0

我认为问题可能是您的模型仅在GUI.model.save();. 所以你应该打电话GUI.model.save();每次更改模型后:

public class scan2D extends Thread{
    public void run(){
        float data;
        for (int y = 0; y<GUI.max_y; y++) {
            for (int x = 0; x<GUI.max_x; x++) {
                GUI.model.set(GUI.edaq.getdata());
                GUI.model.save();
            } 
        }
    }
}
于 2013-08-20T21:16:52.487 回答
0

run在您的情况下,您应该在每次数据更改时启动新线程(也就是执行您的方法)。在对模型进行所有更改之后,我只能猜测您只启动一次新线程。我对吗?

于 2013-08-20T20:47:46.093 回答