forked from: Libspark Threading example, english - including ThreadStepProcessor

by ohisama forked from Libspark Threading example, english - including ThreadStepProcessor (diff: 177)
forked from: Libspark Threading example, english - including ThreadStepProcessor
♥0 | Line 194 | Modified 2013-02-03 13:37:25 | MIT License
play

ActionScript3 source code

/**
 * Copyright ohisama ( http://wonderfl.net/user/ohisama )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/aiwf
 */

//forked from: Libspark Threading example, english - including ThreadStepProcessor
package 
{
    import org.libspark.thread.*; 
    import flash.display.*;
    public class ThreadLibraryExample extends Sprite 
    {
        public function ThreadLibraryExample()
        {
            Wonderfl.capture_delay(7);
            Thread.initialize(new EnterFrameThreadExecutor());
            var setup : SetupThread = new SetupThread(this);
            setup.start();
        }
    }
}
import flash.utils.getQualifiedClassName;
import org.libspark.thread.Thread;
import org.libspark.thread.step.StepThread;
import org.libspark.thread.threads.display.LoaderThread;
import org.libspark.thread.threads.net.URLLoaderThread;
import org.libspark.thread.utils.Progress;
import org.libspark.thread.utils.IProgress;
import org.libspark.thread.utils.events.ProgressEvent;
import org.libspark.thread.utils.ParallelExecutor;
import org.libspark.thread.utils.IProgressNotifier;
import flash.net.navigateToURL;
import flash.display.*;
import flash.errors.IOError;
import flash.events.Event;
import flash.net.URLRequest;
import flash.text.*;
import flash.system.Security;
import flash.events.MouseEvent;
class SetupThread extends Thread 
{
    private var _container : DisplayObjectContainer;
    private var _configLoader : URLLoaderThread;
    private var _allImagesLoader : ParallelExecutor;
    private var _messageDisplay : MessageDisplay;
    private var _pseudoThread : PseudoThread;
    public function SetupThread(container : DisplayObjectContainer) 
    {
        _container = container;
    }
    override protected function run() : void 
    {
        _configLoader = new URLLoaderThread(new URLRequest("http://search.twitter.com/search.atom?q=jk"));
        _configLoader.start();
        _configLoader.join();
        error(IOError, handleError);
        error(SecurityError, handleError);
        next(loadImagesOfTwitterFeed);
    }
    private function handleError(error : Error, thread : Thread) : void 
    {
        message(error.message, true);
        interrupt();
    }
    private function loadImagesOfTwitterFeed() : void 
    {
        if (!isInterrupted) 
        {
            var xml : XML = new XML(_configLoader.loader.data);
            var images : XMLList = xml..(xml.namespace())::link.(@type == "image/png" || @type == "image/jpeg" || @type == "image/jpg" || @type == "image/gif");
            _allImagesLoader = new ParallelExecutor();
            for each(var image : XML in images) 
            {
                _allImagesLoader.addThread(new LoaderThread(new URLRequest(image.@href)));
            }
            _allImagesLoader.start();
            _allImagesLoader.join();
            error(IOError, handleError);
            error(SecurityError, handleError);
            next(addImages);
        }
    }
    private function addImages() : void 
    {
        if (!isInterrupted) 
        {
            var stageWidth : int = _container.stage.stageWidth;
            var maxHeight : int = 0;
            var x : int = 0;
            var y : int = 0;
            for (var i : int = 0; i< _allImagesLoader.numThreads; ++i) 
            {
                var content : DisplayObject = LoaderThread(_allImagesLoader.getThreadAt(i)).loader;
                if (x + content.width > stageWidth) 
                {
                    x = 0;
                    y += maxHeight;
                }
                content.x = x;
                content.y = y;
                if (content.height > maxHeight) 
                {
                    maxHeight = content.height;
                }
                x += content.width;
                _container.addChild(content);
            }
            message("click me in the next 5 seconds");
            event(_container.stage, MouseEvent.MOUSE_DOWN, startPseudoThread);
            //wait(5000);
            //timeout(showClickFailed);
        }
    }
    private function showClickFailed() : void 
    {
        message("You were too slow!", true);
    }
    private function startPseudoThread(event : Event = null) : void 
    {
        message("Starting pseudo thread");
        _pseudoThread = new PseudoThread();
        _pseudoThread.start();
        _pseudoThread.join();
        _pseudoThread.progress.addEventListener(ProgressEvent.UPDATE, showPercentage);
        error(Error, handleError);
        next(finish);
    }
    private function showPercentage(event : ProgressEvent) : void 
    {
        message(int(_pseudoThread.progress.percent * 100) + "%");
    }
    private function finish() : void 
    {
        message("pseudo thread finished");
    }
    override protected function finalize() : void 
    {
        _container = null;
        _configLoader = null;
        _allImagesLoader = null;
        _messageDisplay = null;
    }
    internal function message(message : String, error : Boolean = false) : void 
    {
        if (_messageDisplay) 
        {
            _container.removeChild(_messageDisplay);
            _messageDisplay = null;
        }
        if (message) 
        {
            _container.addChild(_messageDisplay = new MessageDisplay(message, error));
        }
    }
}
class PseudoThread extends StepThread implements IProgressNotifier 
{
    private static const MAX : int = 50000000;
    private var _progress : Progress = new Progress();
    private var _i : int;
    override protected function init() : void 
    {
        _progress.start(MAX);
        _i = 0;
    }
    override protected function process() : Boolean 
    {
        ++_i;
        return _i >= MAX;
    }
    override protected function updateState() : void 
    {
        _progress.progress(_i);
    }
    public function get progress() : IProgress 
    {
        return _progress;
    }
}
class MessageDisplay extends Sprite 
{
    private var _text : TextField;
    public function MessageDisplay(message : String, error : Boolean) 
    {
        addChild(_text = new TextField());
        _text.defaultTextFormat = new TextFormat("Verdana", 10, 0xFFFFFF);
        _text.autoSize = TextFieldAutoSize.LEFT;
        _text.text = message;
        with (graphics) 
        {
            beginFill(error ? 0xAC0000 : 0x00AC00);
            drawRoundRect(0, 0, _text.textWidth + 10, _text.textHeight + 10, 5);
            endFill();
        }
        addEventListener(Event.ADDED_TO_STAGE, render);
    }
    private function render(event : Event) : void 
    {
        x = stage.stageWidth / 2 - width / 2;
        y = stage.stageHeight / 2 - height / 2;
    }
}