Revision: 10737
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at January 12, 2009 00:11 by copyleftdev
Initial Code
ackage be.boulevart.threading { import flash.display.Sprite; import flash.display.Stage; import flash.events.Event; import flash.events.EventDispatcher; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.utils.getTimer; public class PseudoThread extends EventDispatcher { // number of milliseconds we think it takes to render the screen public var RENDER_DEDUCTION : int = 20; private var fn : Function; private var obj : Object; private var thread : Sprite; private var start : Number; private var due : Number; private var sm : Sprite private var mouseEvent : Boolean; private var keyEvent : Boolean; public function PseudoThread(yourStage : Stage,threadFunction : Function,threadObject : Object = null) { fn = threadFunction; sm = new Sprite() yourStage.addChild(sm) if(obj == null) { obj = threadObject; }else { obj = new Object() } // add high priority listener for ENTER_FRAME sm.stage.addEventListener(Event.ENTER_FRAME , enterFrameHandler , false , 200 , true); sm.stage.addEventListener(MouseEvent.MOUSE_MOVE , mouseMoveHandler , false , 0 , true); sm.stage.addEventListener(KeyboardEvent.KEY_DOWN , keyDownHandler , false , 0 , true); thread = new Sprite(); sm.addChild(thread); thread.addEventListener(Event.RENDER , renderHandler); } private function enterFrameHandler(event : Event) : void { start = getTimer(); var fr : Number = Math.floor(1000 / thread.stage.frameRate); due = start + fr; thread.stage.invalidate(); thread.graphics.clear(); thread.graphics.moveTo(0 , 0); thread.graphics.lineTo(0 , 0); } private function renderHandler(event : Event) : void { if (mouseEvent || keyEvent) due -= RENDER_DEDUCTION; while (getTimer() < due) { if(obj == null) { if (!fn()) { if (!thread.parent) return; sm.stage.removeEventListener(Event.ENTER_FRAME , enterFrameHandler); sm.stage.removeEventListener(MouseEvent.MOUSE_MOVE , mouseMoveHandler); sm.stage.removeEventListener(KeyboardEvent.KEY_DOWN , keyDownHandler); sm.removeChild(thread); thread.removeEventListener(Event.RENDER , renderHandler); thread = null thread = new Sprite() dispatchEvent(new Event("threadComplete")); } }else { if (!fn(obj)) { if (!thread.parent) return; sm.stage.removeEventListener(Event.ENTER_FRAME , enterFrameHandler); sm.stage.removeEventListener(MouseEvent.MOUSE_MOVE , mouseMoveHandler); sm.stage.removeEventListener(KeyboardEvent.KEY_DOWN , keyDownHandler); sm.removeChild(thread); thread = null thread = new Sprite() thread.removeEventListener(Event.RENDER , renderHandler); dispatchEvent(new Event("threadComplete")); } } } mouseEvent = false; keyEvent = false; } private function mouseMoveHandler(event : Event) : void { mouseEvent = true; } private function keyDownHandler(event : Event) : void { keyEvent = true; } } }
Initial URL
http://www.joristimmerman.be/wordpress/2009/01/11/pseudo-threading-in-actionscrip-as3/
Initial Description
Initial Title
Pseudo Threading in Actionscript 3 (for Flash
Initial Tags
actionscript, 3, Flex
Initial Language
ActionScript 3