ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   超ビギナー
     スクリプトのタイムアウトの設定
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
imari
投稿日時: 2007-4-27 12:56
お馴染みさん
登録日: 2007-2-9
居住地:
投稿: 19
スクリプトのタイムアウトの設定
AS側での処理時間が長くかかってしまい、以下のエラーが出てしまいます。

 ActionScript エラーが発生しました:
 Error: Error #1502: スクリプトがデフォルトのタイムアウト時間の15秒を越えて実行されました。


Application の scriptTimeLimit プロパティをいじれば直るのかと思ったのですが、60に設定しても同様のエラーが出てしまいます。

このようなエラーはFlexアプリ側でタイムアウト時間を延長する等の制御は可能なのでしょうか?
もしくは、FlashPlayerの設定が必要なのでしょうか?

どなたかご存知の方がいらっしゃいましたらご教示願います。
Crono
投稿日時: 2007-4-27 14:43
ご主人様
登録日: 2006-6-21
居住地: 飯田橋/ヴァナディール
投稿: 229
Re: スクリプトのタイムアウトの設定
以前クライアントで長時間の処理が必要な機能を作成したときは「MAX」60秒でした。
60秒「待ち時間」をユーザーに対して強いるという「要件」や「設計」は「間違い」=Adobeの「設計思想」かもしれません。
(わたしの勝手な想像です)

以下、対策案:
・実装をがんばって見直して処理自体を高速化し60秒を切る!
・処理を細かい処理に分割したりして、1個1個の処理は60秒ルールに従っているようにFlashPlayerをだます
・要件や設計そのものを見直す(これ、時には必要)
imari
投稿日時: 2007-4-27 17:02
お馴染みさん
登録日: 2007-2-9
居住地:
投稿: 19
Re: スクリプトのタイムアウトの設定
>Cronoさま

メッセージでは15秒となっているのですが、やはり60秒ルールなのでしょうか?

とりあえずは処理分割をしてだましだましやってみようと思うのですが、FlashPlayerはどのレベルで分割されていると見てくれるのでしょうか?

例えば、あるボタンを押下したときに呼ばれる関数をonClickとしたときに、元々の関数は
private function onClick():void{
  var a:String = "";
  for(var i:int=0; aryA.length; i++){
    a += aryA[i];
  }

  for(var j:int=0; aryB.length; j++){
    b += aryB[j];
  }
  Alert.show(a+b);
}
であった場合、
private function onClick():void{
 var a:String = func(aryA);
  var b:String = func(aryB);
  Alert.show(a+b);
}
 
private function func(ary:Array):String{
  for(var i:int=0; ary.length; i++){
    ret += ary[i];
  }
  return ret;
}

といった感じでコーディングすれば分割していると見てくれるのでしょうか?
ご存知でしたらご教示いただけないでしょうか?
venzou
投稿日時: 2007-4-30 11:16
ご主人様
登録日: 2007-1-25
居住地: 穴の中
投稿: 101
Re: スクリプトのタイムアウトの設定
こんにちは お邪魔します。

引用:
メッセージでは15秒となっているのですが、やはり60秒ルールなのでしょうか?

scriptTimeLimit で設定した時間になります。デフォルト60秒、最大60秒です。
エラーメッセージが間違っているだけのようですね。
(実際エラーが出るのは60秒経ってからですよね?)

分割の方法ですが、関数を分けるだけではダメみたいです。
別のイベントとして実行する必要があると思います。
callLater()を使う方法が簡単だと思います。

sample.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    scriptTimeLimit="10"
>
    <mx:Script>
        <![CDATA[
        import flash.utils.getTimer;
        import mx.controls.Alert;
        
        public function test1():void {
            wait(15000);
            Alert.show("test1 End");
        }

        public function test2():void {
            wait(5000);
            wait(5000);
            wait(5000);
            Alert.show("test2 End");
        }
        
        public function test3():void {
            wait(5000);
            callLater(test3_1);
        }
        
        public function test3_1():void {
            wait(5000);
            callLater(test3_2);
        }
        
        public function test3_2():void {
            wait(5000);
            Alert.show("test3 End");
        }

        public function test4():void {
            callLater(test4_0);
            callLater(test4_1);
            callLater(test4_2);
        }
        
        public function test4_0():void {
            wait(5000);
        }
        
        public function test4_1():void {
            wait(5000);
        }
        
        public function test4_2():void {
            wait(5000);
            Alert.show("test4 End");
        }

        public function wait(len:int):void {
            var st:uint = getTimer();
            var time:uint;
            var tmp:uint = 0;
            while((time = (getTimer() - st)) <= len){
                if((time % 1000 == 0) && (tmp != time)){
                    trace(tmp = time);
                }
            }
        }

        ]]>
    </mx:Script>
    <mx:Button label="Test1" click="test1()" />
    <mx:Button label="Test2" click="test2()" />
    <mx:Button label="Test3" click="test3()" />
    <mx:Button label="Test4" click="test4()" />
</mx:Application>


test1()、test2()はエラーになります。

test3()はOKです。
test3()はcallLater()を使って、数珠つなぎに処理を実行します。
1つの処理は、次の処理をセットし、終了します。
この、終了する所が重要ですね。

test4()はまとめてcallLater()を呼んでいますが、エラーになります。
callLater()の処理は、並列で実行されるのではなく、登録した順に実行されます。
登録した処理の合計が、scriptTimeLimitを越えるとエラーになるようです。
imari
投稿日時: 2007-5-1 10:08
お馴染みさん
登録日: 2007-2-9
居住地:
投稿: 19
Re: スクリプトのタイムアウトの設定
venzouさま

確かにエラーが出るのは60秒後みたいです。
15秒のメッセージに惑わされてました。

callLater()でイベント分割しなくてはいけないのですね、勉強になります。
早速試してみたいと思います。

ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を