We are about to switch to a new forum software. Until then we have removed the registration on this forum.
I'm experimenting with how to process some data in one function while displaying a loading bar on the screen. For an example, I'm adding a bunch of values to an array - a process that takes about 5 seconds on my computer. I have the following code:
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";
}
But I just get a grey screen (indicating that background(255) has never been called) for about 5 seconds until I get a green screen. I could, of course, replace the code with something like:
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);
}
}
And that would work for this simple example, but I am trying to get draw() to work when called from a function explicitly as depending on the complexity of load() (the one I'm actually trying to get to work in my project is 250+ lines long of opening and uncompressing files, processing JSONArrays and ArrayLists, etc.) splitting the load function into chunks inside draw() could be a nightmare. So is there anyway to update the screen from inside a function?
Thanks in advance for all your help :)
Answers
read the tutorial on setup and draw and the forum FAQ.
in short, draw is called on a timer and trying to subvert that probably won't work.
for 5 seconds i wouldn't even bother with a bar showing progress. the mac beachball doesn't show progress...
Well, as I said, this is but a sample - my real bar is much longer than 5 seconds. I think I may have been able to answer my question using thread().
ha, i was just about to post this https://processing.org/reference/thread_.html
which pretty much does what you want - loads a json file in a thread in the background.
Yep. All I had to do was replace load() in line 13 of my first code with thread("load")