チェンジセット 523

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

Thread(soumen): Thread#sleep のテスト+実装

ファイル:

凡例:

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

    r522 r523  
    204204                public static function sleep(time:uint):void 
    205205                { 
    206                          
     206                        // time が 0 だと永遠に待ってしまうので最低でも 1 にする 
     207                        if (time == 0) { 
     208                                time = 1; 
     209                        } 
     210                         
     211                        // カレントスレッドを取得 
     212                        var current:Thread = getCurrentThread(); 
     213                         
     214                        // sleep 用のモニタがなければ生成 
     215                        if (current._sleepMonitor == null) { 
     216                                current._sleepMonitor = new Monitor(); 
     217                        } 
     218                         
     219                        // sleep 用のモニタを使って wait をかけて指定時間眠らせる 
     220                        current._sleepMonitor.wait(time); 
    207221                } 
    208222                 
     
    224238                        _waitMonitor = null; 
    225239                        _joinMonitor = null; 
     240                        _sleepMonitor = null; 
    226241                        _errorHandlers = null; 
    227242                        _error = null; 
     
    239254                private var _waitMonitor:IMonitor; 
    240255                private var _joinMonitor:IMonitor; 
     256                private var _sleepMonitor:IMonitor; 
    241257                private var _errorHandlers:Dictionary; 
    242258                private var _error:Object; 
     
    333349                        _state = _runningState; 
    334350                         
     351                        // sleep によるタイムアウトではない場合 
     352                        if (_waitMonitor != _sleepMonitor) { 
     353                                // 次に実行する実行関数をタイムアウト用のものに切り替える 
     354                                if (_timeoutHandler != null) { 
     355                                        _runHandler = _timeoutHandler; 
     356                                } 
     357                        } 
     358                         
    335359                        // 保存されていたモニタを破棄 
    336360                        _waitMonitor = null; 
    337                          
    338                         // 次に実行する実行関数をタイムアウト用のものに切り替える 
    339                         if (_timeoutHandler != null) { 
    340                                 _runHandler = _timeoutHandler; 
    341                         } 
    342361                } 
    343362                 
  • as3/Thread/branches/soumen/tests/org/libspark/thread/AuxiliaryTest.as

    r515 r523  
    6767                        t.start(); 
    6868                } 
     69                 
     70                /** 
     71                 * 指定した時間以上 sleep できているかどうか。 
     72                 */ 
     73                test function sleep():void 
     74                { 
     75                        var s:SleepTestThread = new SleepTestThread(); 
     76                        var t:TesterThread = new TesterThread(s); 
     77                         
     78                        t.addEventListener(Event.COMPLETE, async(function(e:Event):void 
     79                        { 
     80                                assertTrue(s.time >= 500); 
     81                        }, 1000)); 
     82                         
     83                        t.start(); 
     84                } 
    6985        } 
    7086} 
    7187 
    7288import org.libspark.thread.Thread; 
     89import flash.utils.getTimer; 
    7390 
    7491class Static 
     
    140157        } 
    141158} 
     159 
     160class SleepTestThread extends Thread 
     161{ 
     162        public var time:uint = 0; 
     163        private var _t:uint; 
     164         
     165        override protected function run():void 
     166        { 
     167                _t = getTimer(); 
     168                 
     169                sleep(500); 
     170                next(slept); 
     171        } 
     172         
     173        private function slept():void 
     174        { 
     175                time = getTimer() - _t; 
     176        } 
     177}