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();
    }
}

GUIオブジェクトにscan2dオブジェクトを作成し、GUIのスタートボタンを押すことで起動します。「モデル」オブジェクトが1回だけ更新され、最終的にすべてのデータが1つずつ更新されることを除いて、すべてが機能します。「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 を使用すると動作し、出力にデータが 1 つずつ表示されます。表示だけの問題ですか?

4

3 に答える 3

0

あなたの場合run、データが変更されるたびに新しいスレッドを開始する(つまり、メソッドを実行する)必要があります。モデルにすべての変更が加えられた後、新しいスレッドを1回だけ開始していると推測できます。私は正しいですか?

于 2013-08-20T20:47:46.093 に答える
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 に答える