チェンジセット 532

差分発生行の前後
無視リスト:
コミット日時:
2008/05/27 21:42:44 (6 ヶ月前)
コミッタ:
yossy
ログメッセージ:

Thread(soumen): URLLoaderThread とそのサンプルを新仕様にアップデート

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/Thread/branches/soumen/Thread.as3proj

    r530 r532  
    6565  <!-- Class files to compile (other referenced classes will automatically be included) --> 
    6666  <compileTargets> 
    67     <compile path="samples\00.hello\Sample.as" /> 
     67    <compile path="samples\urlloader\Sample.as" /> 
    6868  </compileTargets> 
    6969  <!-- Paths to exclude from the Project Explorer tree --> 
  • as3/Thread/branches/soumen/samples/urlloader/MainThread.as

    r150 r532  
    1 package 
     1package 
    22{ 
     3        import flash.events.Event; 
    34        import org.libspark.thread.Thread; 
    4          
    55        import org.libspark.utils.concurrent.Executor; 
    6         import org.libspark.utils.concurrent.SerialExecutor; 
     6        import org.libspark.utils.concurrent.ParallelExecutor; 
    77         
    88        import org.libspark.net.URLLoaderThread; 
     
    1414         
    1515        /** 
    16          * このスレッドは、URLLoaderThreadとSerialExecutorを用いて、平行して三つのURLからデータをダウンロードします 
     16         * このスレッドは、URLLoaderThread と ParallelExecutor を用いて、平行して三つの URL からデータをダウンロードします 
    1717         */ 
    1818        public class MainThread extends Thread 
     
    2121                 
    2222                /** 
    23                  * initializeメソッドには初期化処理を記述します 
     23                 * スレッドの処理は run メソッドをオーバーライドして記述します 
    2424                 */ 
    25                 protected override function initialize():void 
     25                override protected function run():void 
    2626                { 
    27                         // 並列してスレッドを実行するためのSerialExecutorを作成します 
    28                         _loaders = new SerialExecutor(); 
     27                        // 並列してスレッドを実行するための ParallelExecutor を作成します 
     28                        _loaders = new ParallelExecutor(); 
    2929                         
    3030                        // これに、三つのURLLoaderThreadを追加します 
     
    3232                        _loaders.addThread(new URLLoaderThread(new URLRequest('http://www.yahoo.co.jp/'))); 
    3333                        _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); 
    3447                } 
    3548                 
    3649                /** 
    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 メソッドには、ロード完了後の処理を書く事にします 
    5451                 */ 
    5552                private function executeComplete():void 
     
    6461                        } 
    6562                         
    66                         // 終了 
    67                         terminate(); 
     63                        // next を設定しなければスレッドは終了します 
     64                        // 終了の前には finalize が呼び出されます 
    6865                } 
    6966                 
    7067                /** 
    71                  * finalizeメソッドには終了処理を書きます 
     68                 * スレッドの終了処理は finalize メソッドをオーバーライドして記述します 
    7269                 */ 
    7370                protected override function finalize():void 
     
    7976                 
    8077                /** 
    81                  * catchErrorメソッドには、例外処理を書きます 
    82                  * 子スレッド(=_loaders)で発生した例外もここにきます 
     78                 * 例外ハンドラ 
    8379                 * 
    84                  * @param thread 例外が発生したスレッド 
    85                  * @param e 発生した例外 
     80                 * @param      e       発生した例外 
     81                 * @param      thread  発生元のスレッド 
    8682                 */ 
    87                 protected override function catchError(thread:Thread, e:Error):void 
     83                private function errorHandler(e:IOError, t:Thread):void 
    8884                { 
    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!!'); 
    10486                         
    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); 
    11291                } 
    11392        } 
  • as3/Thread/branches/soumen/samples/urlloader/Sample.as

    r150 r532  
    1 package 
     1package 
    22{ 
    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 
    88        /** 
    9          * このサンプルではURLLoaderThreadの使用方法などを学びます 
     9         * このサンプルでは URLLoaderThread の使用方法などを学びます 
    1010         * 
    11          * 詳細はMainThreadを見てください 
     11         * 詳細は MainThread を見てください 
    1212         */ 
    1313        public class Sample extends Sprite 
     
    1515                public function Sample() 
    1616                { 
    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(); 
    3125                } 
    3226        } 
  • as3/Thread/branches/soumen/src/org/libspark/net/URLLoaderThread.as

    r150 r532  
    1 package org.libspark.net 
     1package org.libspark.net 
    22{ 
    33        import org.libspark.thread.Thread; 
     
    1313         
    1414        /** 
    15          * URLLoaderを用いてデータを読み込むためのスレッドです 
     15         * URLLoader を用いてデータを読み込むためのスレッドです 
    1616         *  
    17          * このスレッドをbeginすると、与えられたURLRequestを用いてロード処理を開始し、 
    18          * ロードが完了(Event.COMPLETE)するとスレッドが終了します。 
     17         * このスレッドを開始すると、与えられた URLRequest を用いてロード処理を開始し、 
     18         * ロードが完了 (Event.COMPLETE) するとスレッドが終了します。 
    1919         *  
    20          * joinメソッドを用いると、簡単にロード待ちをすることができます。 
     20         * join メソッドを用いると、簡単にロード待ちをすることができます。 
    2121         *  
    2222         * ロード中にエラーが発生した場合は、以下の例外がスローされます。 
    23          * これらの例外は、このスレッドをbeginしたスレッド(親スレッド)内の 
    24          * catchErrorハンドラで捕捉する事が出来ます。 
     23         * これらの例外は、このスレッドを開始したスレッド(親スレッド)で捕捉する事が出来ます。 
    2524         * 
    2625         * flash.events.IOErrorEvent.IO_ERROR: flash.errors.IOError 
     
    3029        { 
    3130                /** 
    32                  * 新しいURLLoaderThreadクラスのインスタンスを生成します 
     31                 * 新しい URLLoaderThread クラスのインスタンスを生成します 
    3332                 *  
    34                  * @param request ロード対象となるURLRequest 
    35                  * @param loader ロードに使用するURLLoader。省略もしくはnullの場合、新たに作成したURLLoaderを使用します 
     33                 * @param request ロード対象となる URLRequest 
     34                 * @param loader ロードに使用する URLLoader 。省略もしくは null の場合、新たに作成した URLLoader を使用します 
    3635                 */ 
    3736                public function URLLoaderThread(request:URLRequest, loader:URLLoader = null) 
     
    4645                 
    4746                /** 
    48                  * ロード対象となるURLRequestを返します 
     47                 * ロード対象となる URLRequest を返します 
    4948                 * 
    50                  * @return ロード対象となるURLRequest 
     49                 * @return ロード対象となる URLRequest 
    5150                 */ 
    5251                public function get request():URLRequest 
     
    5655                 
    5756                /** 
    58                  * ロードに使用するURLLoaderを返します 
     57                 * ロードに使用する URLLoader を返します 
    5958                 * 
    60                  * ロード完了(スレッドの終了)後に、ロードしたデータ(URLLoader.data)を取得したい場合などに 
     59                 * ロード完了(スレッドの終了)後に、ロードしたデータ (URLLoader.data) を取得したい場合などに 
    6160                 * このプロパティを使用します。 
    6261                 * 
    63                  * @return ロードに使用するURLLoader 
     62                 * @return ロードに使用する URLLoader 
    6463                 */ 
    6564                public function get loader():URLLoader 
     
    6968                 
    7069                /** 
    71                  * 初期化 
     70                 * ロード処理をキャンセルします 
    7271                 */ 
    73                 protected override function initialize():void 
     72                public function cancel():void 
    7473                { 
    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(); 
    8776                } 
    8877                 
     
    9079                 * 実行 
    9180                 */ 
    92                 protected override function execute():void 
     81                override protected function run():void 
    9382                { 
    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); 
    11294                } 
    11395                 
     
    11799                private function completeHandler(e:Event):void 
    118100                { 
    119                         // 何事も無く終了したのでスレッドを起こす→exeucteがよばれてterminateする 
    120                         notifyAll(); 
     101                        // 何もしない → スレッドが終了する 
    121102                } 
    122103                 
     
    126107                private function ioErrorHandler(e:IOErrorEvent):void 
    127108                { 
    128                         // 例外をセットしてスレッドを起こす→executeが呼ばれて例外が投げられる 
    129                         _error = new IOError(e.text); 
    130                         notifyAll(); 
     109                        // IOError をスロー 
     110                        throw new IOError(e.text); 
    131111                } 
    132112                 
     
    136116                private function securityErrorHandler(e:SecurityErrorEvent):void 
    137117                { 
    138                         // 例外をセットしてスレッドを起こす→executeが呼ばれて例外が投げられる 
    139                         _error = new SecurityError(e.text); 
    140                         notifyAll(); 
     118                        // SecurityError をスロー 
     119                        throw new SecurityError(e.text); 
    141120                } 
    142121                 
    143                 public override function toString():String 
     122                /** 
     123                 * 割り込みハンドラ 
     124                 */ 
     125                private function interruptedHandler():void 
    144126                { 
    145                         return '[URLLoader]'; 
     127                        // ロードをキャンセル 
     128                        _loader.close(); 
    146129                } 
    147130        }