画面上にローディングバーを表示しながら、ある関数でデータを処理する方法を試しています。たとえば、配列に値の束を追加しています。これは、コンピュータ上で約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()内のチャンクに分割する悪夢である。それでは、関数の中から画面を更新する方法はありますか?すべてのあなたの助けを事前に
感謝:)
最後に 'load()'と 'loop()'の先頭に 'noLoop()'を追加しようとしましたが、何も変更されていないようです。そして、 'draw ()が呼び出されたときに既に実行されていることを示します。 –
@VladimirShevyakov 'noLoop()'と 'loop()'を呼び出すと、 'draw()'への最初の呼び出しがまだ完了していないという事実は変わりません。 –
ああ。まあ、実際には 'thread()'を使って問題を解決することができただけです。 –