From e19d2ec6e4a64969e84e3b8ce52c15d9f34205fb Mon Sep 17 00:00:00 2001 From: shiffman Date: Thu, 15 Dec 2011 15:52:17 +0000 Subject: [PATCH] added a new thread() example --- .../Topics/Advanced Data/Threads/Threads.pde | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 java/examples/Topics/Advanced Data/Threads/Threads.pde diff --git a/java/examples/Topics/Advanced Data/Threads/Threads.pde b/java/examples/Topics/Advanced Data/Threads/Threads.pde new file mode 100644 index 000000000..ebcd7a40a --- /dev/null +++ b/java/examples/Topics/Advanced Data/Threads/Threads.pde @@ -0,0 +1,111 @@ +/** + * 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; +} +