チェンジセット 532
- コミット日時:
- 2008/05/27 21:42:44 (6 ヶ月前)
- ファイル:
-
- as3/Thread/branches/soumen/Thread.as3proj (更新) (1 diff)
- as3/Thread/branches/soumen/samples/urlloader/MainThread.as (更新) (6 diffs)
- as3/Thread/branches/soumen/samples/urlloader/Sample.as (更新) (2 diffs)
- as3/Thread/branches/soumen/src/org/libspark/net/ThreadURLLoader.as (削除)
- as3/Thread/branches/soumen/src/org/libspark/net/URLLoaderThread.as (更新) (10 diffs)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/Thread/branches/soumen/Thread.as3proj
r530 r532 65 65 <!-- Class files to compile (other referenced classes will automatically be included) --> 66 66 <compileTargets> 67 <compile path="samples\ 00.hello\Sample.as" />67 <compile path="samples\urlloader\Sample.as" /> 68 68 </compileTargets> 69 69 <!-- Paths to exclude from the Project Explorer tree --> as3/Thread/branches/soumen/samples/urlloader/MainThread.as
r150 r532 1 package1 package 2 2 { 3 import flash.events.Event; 3 4 import org.libspark.thread.Thread; 4 5 5 import org.libspark.utils.concurrent.Executor; 6 import org.libspark.utils.concurrent. SerialExecutor;6 import org.libspark.utils.concurrent.ParallelExecutor; 7 7 8 8 import org.libspark.net.URLLoaderThread; … … 14 14 15 15 /** 16 * このスレッドは、URLLoaderThread とSerialExecutorを用いて、平行して三つのURLからデータをダウンロードします16 * このスレッドは、URLLoaderThread と ParallelExecutor を用いて、平行して三つの URL からデータをダウンロードします 17 17 */ 18 18 public class MainThread extends Thread … … 21 21 22 22 /** 23 * initializeメソッドには初期化処理を記述します23 * スレッドの処理は run メソッドをオーバーライドして記述します 24 24 */ 25 protected override function initialize():void25 override protected function run():void 26 26 { 27 // 並列してスレッドを実行するための SerialExecutorを作成します28 _loaders = new SerialExecutor();27 // 並列してスレッドを実行するための ParallelExecutor を作成します 28 _loaders = new ParallelExecutor(); 29 29 30 30 // これに、三つのURLLoaderThreadを追加します … … 32 32 _loaders.addThread(new URLLoaderThread(new URLRequest('http://www.yahoo.co.jp/'))); 33 33 _loaders.addThread(new URLLoaderThread(new URLRequest('http://www.adobe.com/jp/'))); 34 35 trace('begin loading.'); 36 37 // ロード処理を開始 (= SerialExecutor スレッドを開始) します 38 _loaders.start(); 39 // スレッドが終了 (= ロードが完了) するまで、次のメソッドが実行されないように待ちます 40 _loaders.join(); 41 42 // 次に実行されるメソッドをセットしておきます 43 next(executeComplete); 44 // 例外ハンドラを設定しておきます 45 error(IOError, errorHandler); 46 error(SecurityError, errorHandler); 34 47 } 35 48 36 49 /** 37 * exeucteメソッドにはスレッドの処理を記述します 38 */ 39 protected override function execute():void 40 { 41 // 次に実行されるメソッドをセットしておきます 42 switchExecuteMethod(executeComplete); 43 44 trace('begin loading.'); 45 46 // ロード処理を開始(=SerialExecutorスレッドを開始)します 47 _loaders.begin(); 48 // スレッドが終了(=ロードが完了)するまで、次のメソッドが実行されないように待ちます 49 _loaders.join(); 50 } 51 52 /** 53 * executeCompleteメソッドには、ロード完了後の処理を書く事にします 50 * executeComplete メソッドには、ロード完了後の処理を書く事にします 54 51 */ 55 52 private function executeComplete():void … … 64 61 } 65 62 66 // 終了67 terminate();63 // next を設定しなければスレッドは終了します 64 // 終了の前には finalize が呼び出されます 68 65 } 69 66 70 67 /** 71 * finalizeメソッドには終了処理を書きます68 * スレッドの終了処理は finalize メソッドをオーバーライドして記述します 72 69 */ 73 70 protected override function finalize():void … … 79 76 80 77 /** 81 * catchErrorメソッドには、例外処理を書きます 82 * 子スレッド(=_loaders)で発生した例外もここにきます 78 * 例外ハンドラ 83 79 * 84 * @param thread 例外が発生したスレッド85 * @param e 発生した例外80 * @param e 発生した例外 81 * @param thread 発生元のスレッド 86 82 */ 87 pr otected override function catchError(thread:Thread, e:Error):void83 private function errorHandler(e:IOError, t:Thread):void 88 84 { 89 try { 90 throw e; 91 } 92 catch (ioError:IOError) { 93 // IOErrorなので例外を出力して終了 94 trace(ioError.message); 95 terminate(); 96 return; 97 } 98 catch (securityError:SecurityError) { 99 // SecurityErrorなので例外を出力して終了 100 trace(securityError.message); 101 terminate(); 102 return; 103 } 85 trace('error!!'); 104 86 105 // それ以外の例外はこのスレッドの管轄外なので上位スレッドに投げる 106 throw e; 107 } 108 109 public override function toString():String 110 { 111 return '[Main]'; 87 // 例外を出力して終了 88 trace(e.getStackTrace()); 89 // 例外ハンドラから終了するには、明示的に next(null) を呼び出します 90 next(null); 112 91 } 113 92 } as3/Thread/branches/soumen/samples/urlloader/Sample.as
r150 r532 1 package1 package 2 2 { 3 import flash.display.Sprite;4 import flash.events.Event; 5 6 import org.libspark.thread.MasterThread;7 3 import flash.display.Sprite; 4 5 import org.libspark.thread.Thread; 6 import org.libspark.thread.EnterFrameThreadExecutor; 7 8 8 /** 9 * このサンプルでは URLLoaderThreadの使用方法などを学びます9 * このサンプルでは URLLoaderThread の使用方法などを学びます 10 10 * 11 * 詳細は MainThreadを見てください11 * 詳細は MainThread を見てください 12 12 */ 13 13 public class Sample extends Sprite … … 15 15 public function Sample() 16 16 { 17 // スレッドを実行するためのMasterThreadを作成します 18 // 引数には一番最初に実行するスレッド(メインスレッド)を渡します。ここではMainThread 19 _master = new MasterThread(new MainThread()); 20 21 addEventListener(Event.ENTER_FRAME, enterFrameHandler); 22 } 23 24 private var _master:MasterThread; 25 26 private function enterFrameHandler(event:Event):void 27 { 28 // MasterThreadのexecuteActiveThreadsメソッドを呼び出すことで、スレッドが実行されます 29 // 通常、EnterFrameのタイミングで呼び出すことになるでしょう 30 _master.executeActiveThreads(); 17 // スレッドを実行するには、まずはじめに Thread#initialize をコールし、スレッドライブラリを初期化します 18 // Thread#initialize には、IThreadExecutor のインスタンスを渡します 19 // ここでは EnterFrameExecutor を渡し、毎フレームスレッドが実行されるようにします 20 Thread.initialize(new EnterFrameThreadExecutor()); 21 22 // MainThread を起動します 23 var main:MainThread = new MainThread(); 24 main.start(); 31 25 } 32 26 } as3/Thread/branches/soumen/src/org/libspark/net/URLLoaderThread.as
r150 r532 1 package org.libspark.net1 package org.libspark.net 2 2 { 3 3 import org.libspark.thread.Thread; … … 13 13 14 14 /** 15 * URLLoader を用いてデータを読み込むためのスレッドです15 * URLLoader を用いてデータを読み込むためのスレッドです 16 16 * 17 * このスレッドを beginすると、与えられたURLRequestを用いてロード処理を開始し、18 * ロードが完了 (Event.COMPLETE)するとスレッドが終了します。17 * このスレッドを開始すると、与えられた URLRequest を用いてロード処理を開始し、 18 * ロードが完了 (Event.COMPLETE) するとスレッドが終了します。 19 19 * 20 * join メソッドを用いると、簡単にロード待ちをすることができます。20 * join メソッドを用いると、簡単にロード待ちをすることができます。 21 21 * 22 22 * ロード中にエラーが発生した場合は、以下の例外がスローされます。 23 * これらの例外は、このスレッドをbeginしたスレッド(親スレッド)内の 24 * catchErrorハンドラで捕捉する事が出来ます。 23 * これらの例外は、このスレッドを開始したスレッド(親スレッド)で捕捉する事が出来ます。 25 24 * 26 25 * flash.events.IOErrorEvent.IO_ERROR: flash.errors.IOError … … 30 29 { 31 30 /** 32 * 新しい URLLoaderThreadクラスのインスタンスを生成します31 * 新しい URLLoaderThread クラスのインスタンスを生成します 33 32 * 34 * @param request ロード対象となる URLRequest35 * @param loader ロードに使用する URLLoader。省略もしくはnullの場合、新たに作成したURLLoaderを使用します33 * @param request ロード対象となる URLRequest 34 * @param loader ロードに使用する URLLoader 。省略もしくは null の場合、新たに作成した URLLoader を使用します 36 35 */ 37 36 public function URLLoaderThread(request:URLRequest, loader:URLLoader = null) … … 46 45 47 46 /** 48 * ロード対象となる URLRequestを返します47 * ロード対象となる URLRequest を返します 49 48 * 50 * @return ロード対象となる URLRequest49 * @return ロード対象となる URLRequest 51 50 */ 52 51 public function get request():URLRequest … … 56 55 57 56 /** 58 * ロードに使用する URLLoaderを返します57 * ロードに使用する URLLoader を返します 59 58 * 60 * ロード完了(スレッドの終了)後に、ロードしたデータ (URLLoader.data)を取得したい場合などに59 * ロード完了(スレッドの終了)後に、ロードしたデータ (URLLoader.data) を取得したい場合などに 61 60 * このプロパティを使用します。 62 61 * 63 * @return ロードに使用する URLLoader62 * @return ロードに使用する URLLoader 64 63 */ 65 64 public function get loader():URLLoader … … 69 68 70 69 /** 71 * 初期化70 * ロード処理をキャンセルします 72 71 */ 73 p rotected override function initialize():void72 public function cancel():void 74 73 { 75 _error = null; 76 77 _loader.addEventListener(Event.COMPLETE, completeHandler); 78 _loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 79 _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 80 81 // ロードした瞬間エラーイベントが発生してnotifyAllされるかもしれないので 82 // 先にwaitしておく(notifyAllするまでexecuteは呼び出されなくなる) 83 wait(); 84 85 // ロード開始 86 _loader.load(_request); 74 // 割り込みをかける 75 interrupt(); 87 76 } 88 77 … … 90 79 * 実行 91 80 */ 92 protected override function execute():void81 override protected function run():void 93 82 { 94 // 例外はexecuteメソッド(もしくはswitchExecuteMethodで指定したメソッド)内で 95 // スローしないと、catchErrorなどで捕捉できないので注意 96 if (_error != null) { 97 throw _error; 98 } 99 terminate(); 100 } 101 102 /** 103 * 終了処理 104 */ 105 protected override function finalize():void 106 { 107 // ちなみに、例外によって終了した場合もfinalizeは呼ばれる 108 _loader.close(); 109 _loader.removeEventListener(Event.COMPLETE, completeHandler); 110 _loader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 111 _loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 83 // イベントハンドラを設定 84 // Note: イベントハンドラを設定した場合、自動的に wait がかかる 85 event(_loader, Event.COMPLETE, completeHandler); 86 event(_loader, IOErrorEvent.IO_ERROR, ioErrorHandler); 87 event(_loader, SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 88 89 // 割り込みハンドラを設定 90 interrupted(interruptedHandler); 91 92 // ロード開始 93 _loader.load(_request); 112 94 } 113 95 … … 117 99 private function completeHandler(e:Event):void 118 100 { 119 // 何事も無く終了したのでスレッドを起こす→exeucteがよばれてterminateする 120 notifyAll(); 101 // 何もしない → スレッドが終了する 121 102 } 122 103 … … 126 107 private function ioErrorHandler(e:IOErrorEvent):void 127 108 { 128 // 例外をセットしてスレッドを起こす→executeが呼ばれて例外が投げられる 129 _error = new IOError(e.text); 130 notifyAll(); 109 // IOError をスロー 110 throw new IOError(e.text); 131 111 } 132 112 … … 136 116 private function securityErrorHandler(e:SecurityErrorEvent):void 137 117 { 138 // 例外をセットしてスレッドを起こす→executeが呼ばれて例外が投げられる 139 _error = new SecurityError(e.text); 140 notifyAll(); 118 // SecurityError をスロー 119 throw new SecurityError(e.text); 141 120 } 142 121 143 public override function toString():String 122 /** 123 * 割り込みハンドラ 124 */ 125 private function interruptedHandler():void 144 126 { 145 return '[URLLoader]'; 127 // ロードをキャンセル 128 _loader.close(); 146 129 } 147 130 }
