[AS3 Worker] Thread Test
드디어 As3 에 Worker 라는것이 생겼다.
바로 Thread 이다.
하지만 , 방법이 조금 지저분 하다.
실행되고 있는 바이트 코드를 그대로 복제하여 ,백그라운드에서 실행하고 그 결과를 메시지 체널 형태로 주고 받는다.
정확한 Thread 의 개념 보다는 .NET 의 BackgroundWorker 쯤으로 생각하면 될듯하고
쓰레드를 직접실행할 클래스 형태가 필요하다.
아래의 ThreadManager 는 구차한 Worker 생성과정을 미리 생성하고 Thread 객체를 관리하는 매니저 역할이다.
또하나의 Worker1 클래스는 쓰레드 개체가 생성하게될 , 즉 쓰레드가 수행할 내용이다.
아래의 실험은 같은 개체를 동시에 실행 하였을때 쓰레드 블럭킹이 발생하는지 실험하는 코드이다.
* ThreadManager
package { import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import jjongun.threadWorker.Thread; import jjongun.threadWorker.ThreadEvent; import jjongun.threadWorker.ThreadManager; public class TestThread3 extends Sprite { private var thread1 : Thread; private var thread2 : Thread; public function TestThread3() { ThreadManager.Init(this.stage); thread1 = ThreadManager.getInst().createThread(Work1); thread2 = ThreadManager.getInst().createThread(Work1); thread1.addEventListener(ThreadEvent.RECEIVE , receive); thread2.addEventListener(ThreadEvent.RECEIVE , receive); thread1.start(); thread2.start(); stage.addEventListener(KeyboardEvent.KEY_UP , stageKup); } protected function stageKup(e:KeyboardEvent):void { if(e.keyCode == Keyboard.A) { trace("A"); thread1.send(Work1.F1); } else if(e.keyCode == Keyboard.S) { trace("S"); thread2.send(Work1.F2); } } protected function receive(e:ThreadEvent):void { if(e.currentTarget == thread1) { trace(e.receiveData); } else if(e.currentTarget == thread2) { trace(e.receiveData); } } } } |
package { import flash.utils.getTimer; import jjongun.threadWorker.AbsThreadWorker; public class Work1 extends AbsThreadWorker { public function Work1() { super(); } public static const F1 : String = "F1"; public static const F2 : String = "F2"; protected override function threadMessage(command:*):void { trace("command " , command); if(command == F1) { f1(); } else if(command == F2) { f2(); } } private function f1():void { trace("start _ f1 " , getTimer()); var b : Boolean = true; var cur : Number = getTimer(); while(b) { if(getTimer() - cur > 3000) { b = false; } } trace("end _ f1" , getTimer()); } private function f2():void { trace("start _ f2 " , getTimer()); var b : Boolean = true; var cur : Number = getTimer(); while(b) { if(getTimer() - cur > 3000) { b = false; } } trace("end _ f2" , getTimer()); } } } |
결과 블럭킹이 전혀 발생하지 않았고 상상했던 Thread의 역할을 충분히 수행해 주었다.
주의할점은 현재 시점으로 11.4 버전 -swf-version=17 만 가능하다.
혹 그 윗버전의 SDK 로 시도 해보았지만 작동이 안된다. 이유는 모른다. 버그 같다. 어도비 포럼에도 질문만 있을뿐 답이 없다.
머 ,, 곧 해결 되겠지만 , 현재 11.4 버전 만 된다. 버전 체크를 하여 수행하여야 하겠다.
'AS3' 카테고리의 다른 글
FLA Auto build utility for flashbuilder developer (2) | 2014.02.22 |
---|---|
[AS3] asmx 사용하기 (87) | 2013.01.12 |
[AS3 Worker] Thread Test (2920) | 2012.11.15 |
간단한 AS3 바이트 버퍼 나누기 (110) | 2012.03.09 |
[Multitouch on 3D World] (92) | 2012.01.17 |
[Base64] (282) | 2011.12.19 |
AS3
2012.11.15 23:38