いちばん失敗した人決定戦

Part 1:
ランダムなデータ作成はできました。
public static int [] createRandomValues(int seed){
int random[] = new int[seed];
for ( int i = 0; i < seed; i++ ){
random[i] = (int)(Math.random() * seed * (Math.random() > 0.5 ? 1 : -1));
}
return random;
}
上記のメソッドに100を渡すと、-100から+100の間のデータ作成してくれます。

Part 2:
Mainの中にThread作成し、そのThread内から上記のデータ作成部分と描画する部分呼んでいます。Threadだからずっと(連続で)動いて、表示も連続的な表示してほしいけど、固定で一つ画面分表示したままです。リアル・タイムデータ表示みたいに流れた波形を表示してほしいです。

 public static void main(String[] args) {
Thread t1 = new Thread(new Runnable(){
public void run() {
int[] data = createRandomValues(100);
m_plotPanels.plot(data); //描画ルーチンです。
}
});
t1.start();
}

ユーザが画面の「X」を押さないとずっと乱数の配列作られて、そのデータを使って連続表示するのにどうすればよいでしょうか。乱数使っているので次次呼ばれる際、変わった値が出てくるはずですのでリアル・タイムの連続データのように表示されたらうれしい。

使用メモリもどんどん増えないように気を付けないといけないです。

実際の現場ではデータ作成レートが高く、一度バッファーに格納し、間引きしてから表示することも必要ででしょうけど、今回は低速度のデータを順番に表示していきたいと思っています。

知識や経験おもちの方々、アドバイスください。
とりあえす、「このような技術がある」や「こうすればうまく行く」などでも助かります。

よろしくお願いいたします。

質問者からの補足コメント

  • HAPPY

    1. whileループ修正: while(true && !this.isInterrupted()){
    2. run()の後以下追加:
       private boolean isInterrupted() {
    return false;
    }
    3. JFrameやDialogに、actionListener追加
        XXXXX.addWindowListener(new WindowAdapter() {
    public void windowClosed(WindowEvent e) {
    System.exit(1);
    }
    });

    ※上記でやりたいことすべてできました。
    ディスカションに参加されたみなさま、ありがとうございました。

      補足日時:2016/04/27 02:32

A 回答 (4件)

>Thread処理はPart2に書いたとおりで、そのほかはありません。



う~ん、結局詳細は伏せたままにしたいようなので
具体的な指摘は諦めますが

繰り返しになりますが

swingではメインスレッドでしか描画できない
というのは当然考慮したコードになってるのですよね?
    • good
    • 0
この回答へのお礼

Part2に書いた通り、描画処理はメインスレッド内書かれています。

run()処理内、whileループを設けて、データ作成と描画コードをwhileループ内に書いてみました。
これによって、連続的に描画します。Thread.sleep(nnnミリ秒)記述で見やすいタイミングで描画可能ですが、スレッドを止める方法はまだわからない。よって、表示されたdialogの「X」押してもスレッドの読み込みは継続されます。(System.outのところ、ずっと表示し続きます。)

Thread t1 = new Thread(new Runnable(){
public void run() {
boolean running = true;
while(running) {
System.out.println(" test at " + System.currentTimeMillis());
double[] data = createRandomValues(100);
m_plotPanels[0].plot(data);
Thread.sleep(3000); //try, catch省略
}
}
});
t1.start();

※ソースはインデントできないようで読みづらいです。申し訳ありません。

お礼日時:2016/04/27 01:25

無限ループにしちゃいけないんだろうかと思案しつつ, createRandomValues の動作が奇妙だなぁと指摘しよう.

    • good
    • 0
この回答へのお礼

createRandomValuesは呼ばれるたびにランダムな値の配列返す前提で、話題の議論を進めていただきたいです。問題は「どうやってThreadを回し続ける」です。 よろしくお願いします。

お礼日時:2016/04/26 14:01

>描画処理は外部ライブラリで、長いから省略しました。


>問題はどうやってrunの中の処理をずっと回しっぱなしにする、

まずグラフィックスライブラリは何を使ってますか?
JavaFX?、Swing?

また上手くゆかないなら問題の再現する必要最小限のコードか
コードの概略を示すのが常識です。

例えばスレッドからメインスレッドの描画処理の呼び出しを
どう書いてますか?
    • good
    • 0
この回答へのお礼

FrameやパネルなどはSwingです。レンダリング自体はカリフォルニア大学バークレー校のPtolemyというパッケージ使っています。
http://ptolemy.eecs.berkeley.edu/java/ptplot/

描画処理は値が入っている配列を入力パラメーターになっているのでPart2にdataとして渡しています。
Thread処理はPart2に書いたとおりで、そのほかはありません。

お礼日時:2016/04/26 14:10

>固定で一つ画面分表示したままです



の意味が分からないし、具体的な描画処理のコードも無し。
描画に使用しているライブラりさえ書いてない。

これではどうにもならないですね。
    • good
    • 0
この回答へのお礼

tknakamuriさん、
書き込みありがとうございます。
「一つ画面分表示したまま」というのは、runの中の処理が一回しか呼ばれてないと言いたかったです。描画処理は外部ライブラリで、長いから省略しました。問題はどうやってrunの中の処理をずっと回しっぱなしにする、それです。runを繰り返し呼ばれると、part 1の出力が変わる(乱数ですので)ので、表示される画面(波形)が変わると想定しています。

お礼日時:2016/04/26 09:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!