チェンジセット 524

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

Thread(soumen): イベント周りのテスト+実装

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/Thread/branches/soumen/src/org/libspark/thread/Thread.as

    r523 r524  
    11package org.libspark.thread 
    22{ 
     3        import flash.events.Event; 
    34        import flash.events.IEventDispatcher; 
    45        import flash.utils.Dictionary; 
     
    199200                public static function event(dispatcher:IEventDispatcher, type:String, func:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void 
    200201                { 
    201                          
     202                        getCurrentThread().addEventHandler(dispatcher, type, func, useCapture, priority, useWeakReference); 
    202203                } 
    203204                 
     
    239240                        _joinMonitor = null; 
    240241                        _sleepMonitor = null; 
     242                        _eventMonitor = null; 
     243                        _event = null; 
    241244                        _errorHandlers = null; 
    242245                        _error = null; 
    243246                        _errorThread = null; 
     247                        _eventHandlers = null; 
    244248                } 
    245249                 
     
    255259                private var _joinMonitor:IMonitor; 
    256260                private var _sleepMonitor:IMonitor; 
     261                private var _eventMonitor:IMonitor; 
     262                private var _event:Event; 
    257263                private var _errorHandlers:Dictionary; 
    258264                private var _error:Object; 
    259265                private var _errorThread:Thread; 
     266                private var _eventHandlers:Array; 
    260267                 
    261268                public function get id():uint 
     
    461468                         
    462469                        return null; 
     470                } 
     471                 
     472                private function getEventMonitor():IMonitor 
     473                { 
     474                        return _eventMonitor || (_eventMonitor = new Monitor()); 
     475                } 
     476                 
     477                private function getEventHandlers():Array 
     478                { 
     479                        return _eventHandlers || (_eventHandlers = []); 
     480                } 
     481                 
     482                private function addEventHandler(dispatcher:IEventDispatcher, type:String, func:Function, useCapture:Boolean, priority:int, useWeakReference:Boolean):void 
     483                { 
     484                        // イベントハンドラを作成してリストに追加 
     485                        getEventHandlers().push(new EventHandler(dispatcher, type, eventHandler, func, useCapture, priority, useWeakReference)); 
     486                } 
     487                 
     488                private function resetEventHandlers():void 
     489                { 
     490                        // イベントハンドラリストがなければ何もしない 
     491                        if (_eventHandlers == null) { 
     492                                return; 
     493                        } 
     494                         
     495                        // 全てのイベントハンドラの登録を解除 
     496                        for each (var handler:EventHandler in _eventHandlers) { 
     497                                handler.unregister(); 
     498                        } 
     499                         
     500                        // 配列を初期化 
     501                        _eventHandlers.length = 0; 
     502                } 
     503                 
     504                private function eventHandler(e:Event, handler:EventHandler):void 
     505                { 
     506                        // 既にイベントが起こっていれば何もしない 
     507                        if (_event != null) { 
     508                                return; 
     509                        } 
     510                         
     511                        // イベントを保存 
     512                        _event = e.clone(); 
     513                         
     514                        // 該当するイベントハンドラを次の実行関数に設定 
     515                        _runHandler = handler.func; 
     516                         
     517                        // イベントハンドラをリセット 
     518                        resetEventHandlers(); 
     519                         
     520                        // スレッドを起こす 
     521                        _eventMonitor.notifyAll(); 
    463522                } 
    464523                 
     
    565624                        // タイムアウトハンドラをリセット 
    566625                        _timeoutHandler = null; 
     626                        // イベントハンドラをリセット 
     627                        resetEventHandlers(); 
    567628                        // エラーハンドラをリセット 
    568629                        resetErrorHandlers(); 
     
    582643                                try { 
    583644                                        // 実行関数を呼び出す 
    584                                         // エラーハンドラである場合は例外と例外の発生元のスレッドを引数として渡す 
    585                                         runHandler.apply(this, errorHandler != null ? [error, errorThread] : null); 
     645                                        if (errorHandler != null) { 
     646                                                // エラーハンドラである場合は例外と例外の発生元のスレッドを引数として渡す 
     647                                                runHandler.apply(this, [error, errorThread]); 
     648                                        } 
     649                                        else if (_event != null) { 
     650                                                var ev:Event = _event; 
     651                                                _event = null; 
     652                                                // イベントハンドラである場合はイベントを渡す 
     653                                                runHandler.apply(this, [ev]); 
     654                                        } 
     655                                        else { 
     656                                                // それ以外の場合は引数なしで呼び出す 
     657                                                runHandler.apply(this); 
     658                                        } 
    586659                                } 
    587660                                catch (e:Object) { 
     
    616689                        } 
    617690                         
     691                        // イベントハンドラが設定された場合 
     692                        if (_eventHandlers != null && _eventHandlers.length > 0) { 
     693                                // 全てのイベントハンドラを登録 
     694                                for each (var eventHandler:EventHandler in _eventHandlers) { 
     695                                        eventHandler.register(); 
     696                                } 
     697                                // イベントを待機する 
     698                                try { 
     699                                        _currentThread = this; 
     700                                        getEventMonitor().wait(); 
     701                                } 
     702                                finally { 
     703                                        _currentThread = null; 
     704                                } 
     705                        } 
     706                         
    618707                        if (_runHandler != null) { 
    619708                                // 次に実行する実行関数が設定されている場合実行を継続 
     
    10491138        } 
    10501139} 
     1140 
     1141import flash.events.Event; 
     1142import flash.events.IEventDispatcher; 
    10511143 
    10521144class ErrorHandler 
     
    10611153        public var reset:Boolean; 
    10621154} 
     1155 
     1156class EventHandler 
     1157{ 
     1158        public function EventHandler(dispatcher:IEventDispatcher, type:String, listener:Function, func:Function, useCapture:Boolean, priority:int, useWeakReference:Boolean) 
     1159        { 
     1160                this.dispatcher = dispatcher; 
     1161                this.type = type; 
     1162                this.listener = listener; 
     1163                this.func = func; 
     1164                this.useCapture = useCapture; 
     1165                this.priority = priority; 
     1166                this.useWeakReference = useWeakReference; 
     1167        } 
     1168         
     1169        public var dispatcher:IEventDispatcher; 
     1170        public var type:String; 
     1171        public var listener:Function; 
     1172        public var func:Function; 
     1173        public var useCapture:Boolean; 
     1174        public var priority:int; 
     1175        public var useWeakReference:Boolean; 
     1176         
     1177        public function register():void 
     1178        { 
     1179                dispatcher.addEventListener(type, handler, useCapture, priority, useWeakReference); 
     1180        } 
     1181         
     1182        public function unregister():void 
     1183        { 
     1184                dispatcher.removeEventListener(type, handler, useCapture); 
     1185        } 
     1186         
     1187        private function handler(e:Event):void 
     1188        { 
     1189                listener(e, this); 
     1190        } 
     1191} 
  • as3/Thread/branches/soumen/tests/org/libspark/thread/ThreadAllTests.as

    r517 r524  
    1111                        MonitorTest, 
    1212                        AuxiliaryTest, 
    13                         ExceptionTest 
     13                        ExceptionTest, 
     14                        EventTest 
    1415                ]; 
    1516        }