mirror of
https://github.com/processing/processing4.git
synced 2026-01-29 11:21:06 +01:00
112 lines
3.2 KiB
Plaintext
112 lines
3.2 KiB
Plaintext
/**
|
|
* Thread function example
|
|
* by Daniel Shiffman.
|
|
*
|
|
* This example demonstrates how to use thread() to spawn
|
|
* a process that happens outside of the main animation thread.
|
|
*
|
|
* When thread() is called, the draw() loop will continue while
|
|
* the code inside the function passed to thread() will operate
|
|
* in the background.
|
|
*
|
|
* For more about threads, see: http://wiki.processing.org/w/Threading
|
|
*/
|
|
|
|
// This sketch will load data from all of these URLs in a separate thread
|
|
String[] urls = {
|
|
"http://processing.org",
|
|
"http://www.processing.org/exhibition/",
|
|
"http://www.processing.org/reference/",
|
|
"http://www.processing.org/reference/libraries",
|
|
"http://www.processing.org/reference/tools",
|
|
"http://www.processing.org/reference/environment",
|
|
"http://www.processing.org/learning/",
|
|
"http://www.processing.org/learning/basics/",
|
|
"http://www.processing.org/learning/topics/",
|
|
"http://www.processing.org/learning/gettingstarted/",
|
|
"http://www.processing.org/download/",
|
|
"http://www.processing.org/shop/",
|
|
"http://www.processing.org/about/",
|
|
"http://www.processing.org/about/people"
|
|
};
|
|
|
|
// This will keep track of whether the thread is finished
|
|
boolean finished = false;
|
|
// And how far along
|
|
float percent = 0;
|
|
|
|
// A variable to keep all the data loaded
|
|
String allData;
|
|
|
|
void setup() {
|
|
size(640, 360);
|
|
smooth();
|
|
// Spawn the thread!
|
|
thread("loadData");
|
|
}
|
|
|
|
void draw() {
|
|
background(0);
|
|
|
|
// If we're not finished draw a "loading bar"
|
|
// This is so that we can see the progress of the thread
|
|
// This would not be necessary in a sketch where you wanted to load data in the background
|
|
// and hide this from the user, allowing the draw() loop to simply continue
|
|
if (!finished) {
|
|
stroke(255);
|
|
noFill();
|
|
rect(width/2-150, height/2, 300, 10);
|
|
fill(255);
|
|
// The size of the rectangle is mapped to the percentage completed
|
|
float w = map(percent, 0, 1, 0, 300);
|
|
rect(width/2-150, height/2, w, 10);
|
|
textSize(14);
|
|
textAlign(CENTER);
|
|
fill(255);
|
|
text("Loading", width/2, height/2+30);
|
|
}
|
|
else {
|
|
// The thread is complete!
|
|
textAlign(CENTER);
|
|
textSize(24);
|
|
fill(255);
|
|
text("Finished loading. Click the mouse to load again.", width/2, height/2);
|
|
}
|
|
}
|
|
|
|
void mousePressed() {
|
|
thread("loadData");
|
|
}
|
|
|
|
void loadData() {
|
|
// The thread is not completed
|
|
finished = false;
|
|
// Reset the data to empty
|
|
allData = "";
|
|
|
|
// Look at each URL
|
|
// This example is doing some highly arbitrary things just to make it take longer
|
|
// If you had a lot of data parsing you needed to do, this can all happen in the background
|
|
for (int i = 0; i < urls.length; i++) {
|
|
String[] lines = loadStrings(urls[i]);
|
|
// Demonstrating some arbitrary text splitting, joining, and sorting to make the thread take longer
|
|
String allTxt = join(lines, " ");
|
|
String[] words = splitTokens(allTxt, "\t+\n <>=\\-!@#$%^&*(),.;:/?\"\'");
|
|
for (int j = 0; j < words.length; j++) {
|
|
words[j] = words[j].trim();
|
|
words[j] = words[j].toLowerCase();
|
|
}
|
|
words = sort(words);
|
|
allData += join(words, " ");
|
|
percent = float(i)/urls.length;
|
|
}
|
|
|
|
String[] words = split(allData," ");
|
|
words = sort(words);
|
|
allData = join(words, " ");
|
|
|
|
// The thread is completed!
|
|
finished = true;
|
|
}
|
|
|