2017-05-06 14 views
0

画面上にローディングバーを表示しながら、ある関数でデータを処理する方法を試しています。たとえば、配列に値の束を追加しています。これは、コンピュータ上で約5秒かかる処理です。私は、次のコードを持っている:処理3 - 関数からdraw()を呼び出すと画面が更新されない

ArrayList<String> strs = new ArrayList<String>(); 
String state; 
float counter; 

void setup() { 
    size(640, 480); 
    state = "load"; 
    noStroke(); 
} 

void draw() { 
    if (state.equals("load")) { 
    load(); 
    } else if (state.equals("loading")) { 
    background(255); 
    fill(255, 0, 0); 
    rect(0, height/2-25, map(counter, 0, 10000000, 0, width), 50); 
    } else if (state.equals("play")) { 
    background(0, 255, 0); 
    } 
} 

void load() { 
    state = "loading"; 
    for (int i = 0; i < 10000000; i++) { 
    strs.add(str(pow(i, 2))); 

    if (i % 1000 == 0) { 
     counter = i; 
     draw(); 
    } 
    } 
    state = "play"; 
} 

をしかし、私は緑色の画面が表示されるまで、私はちょうど約5秒間(バックグラウンド(255)が呼び出されなかったことを示す)灰色の画面を取得します。私は、もちろん、のようなものを使用してコードを置き換えることができます:

ArrayList<String> strs = new ArrayList<String>(); 
String state; 
int counter; 

void setup() { 
    size(640, 480); 
    state = "load"; 
    noStroke(); 
    counter = 0; 
} 

void draw() { 
    if (state.equals("load")) { 
    float theMillis = millis(); 
    while (millis()-theMillis < 1000.0/frameRate && counter < 10000000) { 
     strs.add(str(pow(counter, 2))); 
     counter++; 
    } 
    if (counter >= 10000000) { 
     state = "play"; 
    } 

    background(255); 
    fill(255, 0, 0); 
    rect(0, height/2-25, map(counter, 0, 10000000, 0, width), 50); 
    } else if (state.equals("play")) { 
    background(0, 255, 0); 
    } 
} 

そして、それは、この単純な例のために働くだろうが、私は明示的に依存するよう関数から呼び出されたときに動作するように)(描き取得しようとしていますload()の複雑さ(私のプロジェクトで実際に働こうとしているのは、ファイルを開いたり開いたり、JSONArraysやArrayListsを処理するなど、250行以上です。)load関数をdraw()内のチャンクに分割する悪夢である。それでは、関数の中から画面を更新する方法はありますか?すべてのあなたの助けを事前に

感謝:)

答えて

1

あなたは発見していたようdraw()機能が完了するまで、処理は、実際に画面を更新しません。だから何が起こっているのは、draw()関数がProcessingによって呼び出され、そのフレームの内部でdraw()という関数が呼び出されたということです。しかし、draw()への最初の呼び出しはまだ完了していないため、画面は更新されません。 draw()へのすべての通話が完了し、最初の通話(処理済)が完了すると更新されます。

draw()を自分で呼び出すのは、通常はかなり悪い考えです。通常は、時間の経過とともに更新する変数を使用して、各フレームの表示内容を変更する必要があります。

別の方法として、別のスレッドを使用してファイルをロードし、描画スレッドを続行することもできます。

+0

最後に 'load()'と 'loop()'の先頭に 'noLoop()'を追加しようとしましたが、何も変更されていないようです。そして、 'draw ()が呼び出されたときに既に実行されていることを示します。 –

+0

@VladimirShevyakov 'noLoop()'と 'loop()'を呼び出すと、 'draw()'への最初の呼び出しがまだ完了していないという事実は変わりません。 –

+0

ああ。まあ、実際には 'thread()'を使って問題を解決することができただけです。 –