ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   ActionScript 3.0
     連続稼動でsetTimeout関数が途中で止まってしまう
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
masu567
投稿日時: 2011-3-1 15:40
やや お馴染みさん
登録日: 2011-3-1
居住地: 関東
投稿: 6
連続稼動でsetTimeout関数が途中で止まってしまう
お世話になっております。
初めてこのような場所に投稿するため、
失礼な点がありましたら、ご指摘宜しくお願い致します。

題名の件で質問させてください。

現在、問題現象がでているロジックは次の通りで
 _萍未僚藉処理から要求の発行
 ↓,量瓩蝓Command.asのresult処理内で
   setTimeout関数を実行
 5秒後に,汎韻戸弋瓩鮑禿挌行
という処理を行っていて 銑を処理した後は◆Νの処理の
繰り替えし実行となっています。

ソースを抜粋すると下記のようになります。
「XXXCommand.as」
public function result(data:Object):void {

・ //取得データmodelへ退避

setTimeout( shori, 5000);
}

public function shori():void {
var delegate :XXXBusiness = new XXXBusiness( this );
delegate.polling();
}

※1 XXXは任意の英字です
※2 pollingメソッドはBusinessに作成してあります

上記のロジックの場合、
長期稼動しているとの処理が実行されず
要求を再度発行しない現象が発生しています。
またその際、画面もフリーズをしてしまいボタン等を押下
出来ない状況になってしまいます。

長期稼動の期間は一定ではなく
1日弱で発生する場合もあれば、3日間発生しない場合も
あります。ActionScriptというよりFlashの問題でしょうか・・・?

全く検討がつかないため、
回避策または問題解決の参考となるような情報が
少しでもあれば、ご教授頂きたく思います。
宜しくお願い致します。

【環境】
OS:WindwosXp(SP3)
IE:7.0.5730.13
FlashPlayer:9.0.124
Flex:3.0
FlexSDK:3.3

長文となってしまい申し訳ありません。
dsh
投稿日時: 2011-3-2 10:26
ご主人様
登録日: 2006-3-29
居住地: 東京
投稿: 296
Re: 連続稼動でsetTimeout関数が途中で止まってしまう
こんにちは、

実はsetTimeoutの使用はあまり推奨されていません。
リファレンスには、このメソッドの替りにTimerクラスを使ってください、と記述されています。
http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/utils/package.html#setTimeout%28%29

なぜかというと、setTimeout(setIntervalも)は引数にクロージャーを取ることから、リソースを消費してしまう為です。

(余談ですが、このメソッドはActionScript 1 / Flash Player 6時代からあるものなので、下位互換性を保つためにも残してあるのだと思います)

問題がsetTimeoutのせいかどうかは投稿の内容からは判断できませんが、少なくとも推奨されていないsetTimeoutを使うのをやめて、Timerクラスを使用する方式で書き換えてみてはいかがでしょうか。

#フリーズしてしまうということから、メモリリソースを消費し尽くしてしまっている可能性は考えられます


----------------
http://shield.jp/blog/
Twitter: @dseg

kacchan6
投稿日時: 2011-3-2 12:10
ご主人様
登録日: 2009-10-15
居住地:
投稿: 167
Re: 連続稼動でsetTimeout関数が途中で止まってしまう
自分も原因不明ですが、setTimeoutが効かないことがありました。
そのときは高負荷のときでしたが、とりあえずEnterFrameで時間計測して逃げました。

メモリリークなどで負荷が高くなっているとかも考えられるかもしれません。

ちなみに、約25日で内部タイマーが31bit(符号付き整数の最大値)を超えて動かなくなるようです。
連続稼動を前提とするにしても、途中でプレイヤーをリロードしてやるとかも必要です。
masu567
投稿日時: 2011-3-2 15:26
やや お馴染みさん
登録日: 2011-3-1
居住地: 関東
投稿: 6
Re: 連続稼動でsetTimeout関数が途中で止まってしまう
dshさん投稿ありがとうございます。

現象の回避が出来るかどうかはわかりませんが、
非推奨のものを使用しているのはあまり良くないですね。
ご指摘ありがとうございます。

Timerを使用するように変更しようと思いますが、
下のようなイメージで問題ないでしょうか?

「XXXCommand.as」
import flash.utils.Timer;
import flash.events.TimerEvent;

public function result(data:Object):void {

・ //取得データmodelへ退避

var timer:Timer = new Timer(5000, 0);
timer.addEventListener(TimerEvent.TIMER, shori);
timer.start();
}

public function shori(event:TimerEvent):void {
var delegate :XXXBusiness = new XXXBusiness( this );
delegate.polling();
timer(event.currentTarget).stop;
}

投稿頂いた上に、更なるお願いで申し訳ありませんが
よろしければソースの確認及びご指摘をして頂けると嬉しく思います。
宜しくお願いします。
dsh
投稿日時: 2011-3-2 16:01
ご主人様
登録日: 2006-3-29
居住地: 東京
投稿: 296
Re: 連続稼動でsetTimeout関数が途中で止まってしまう
こんにちは、

引用:
よろしければソースの確認及びご指摘をして頂けると嬉しく思います。
・ Timerクラスは、メンバ変数として定義し、一度だけインスタンス化した方が良いです
(resultメソッド内で毎回インスタンス化するとリソースが無駄なので)
・Timerのコンストラクタの第二引数は、「1」が適切なのでは?
「0」だと無限の繰り返し指定ですが、「1」だと一回の繰り返し指定なので、意図が明確になると思います。
「1」を指定すると、関連して、shori()内でのtimer.stop呼出は不要になります。
・timerへのイベントリスナ登録は、第五引数で弱参照を使用するよう指定して行った方が良いかもしれません。

public class XXXCommand
{
	import flash.events.TimerEvent;
	import flash.utils.Timer;

	private var timer:Timer;

	public function XXXCommand()
	{
		timer=new Timer(5000, 1);
		timer.addEventListener(TimerEvent.TIMER_COMPLETE, shori, false, 0, true);
	}

	public function result(data:Object):void
	{
		//取得データmodelへ退避
		timer.start();
	}

	public function shori(event:TimerEvent):void
	{
		var delegate :XXXBusiness = new XXXBusiness( this );
		delegate.polling();

	}
}


----------------
http://shield.jp/blog/
Twitter: @dseg

masu567
投稿日時: 2011-3-2 16:14
やや お馴染みさん
登録日: 2011-3-1
居住地: 関東
投稿: 6
Re: 連続稼動でsetTimeout関数が途中で止まってしまう
kacchan6さん投稿ありがとうございます。

高負荷のときにsetTimeoutが効かないことがありました。
ということで私も一度確認をしてみます。

また長期・連続稼動の場合、

>setTimeoutの場合は約25日で内部タイマーが31bit(符号付き整数の最大値)を超えて動かなくなる

現在の想定では業務上、基本365日稼動となっているため、
途中でのリロード等はできないもの考えていますが
Flashの問題で24.8日で挙動が正確ではなくなる事があるという現象も先ほど同サイトで確認しました。
しかしそのPGではTimerのstop処理はしていませんでした。

問題点は2つありそうですね。
 々睇蕾戮虜櫃離瓮皀蝓璽蝓璽
 ¬25日の制限
今回のフリーズしてしまう問題点は
今後考えなければいけない課題が
ということになるでしょうか。

kacchan6さん貴重な情報ありがとうございました。
kacchan6
投稿日時: 2011-3-2 16:43
ご主人様
登録日: 2009-10-15
居住地:
投稿: 167
Re: 連続稼動でsetTimeout関数が途中で止まってしまう
メモリリークについてはプロファイラで確認すれば良いと思います。
メモリリークしていればの話ですが、メモリリークするとプロセスのメモリ使用量が増えます。
その際に、スワップなどの処理が行われる可能性もあります。
それが原因とは言い切れませんが、連続稼動後に発生するなら可能性として捨て切れません。

25日連続稼動については、FlashPlayerの仕様ですので、
諦めてリロードするようにしたほうが良いと思います。
Tweenライブラリを使わない、Timerを使わないなら問題ないかもしれませんが。
masu567
投稿日時: 2011-3-2 20:42
やや お馴染みさん
登録日: 2011-3-1
居住地: 関東
投稿: 6
Re: 連続稼動でsetTimeout関数が途中で止まってしまう
dshさん

ソースの確認及び訂正までして頂きありがとうございます。

コーディングについては理解できました。
ありがとうございます。

度々の質問で申し訳ありませんが再度1点、内容についてお伺いしたいことがあります。

今回dshさんが提供頂いたソースはTimer関数で、1回だけの処理を何度も繰り返す形になると思うので、Timerの2^31の影響がないように思えるのですが、
今回のソースだったとしても365日稼動の弊害24.85日間のFlashPlayerの仕様(要リロード)は避けられないのでしょうか?

【Flex 3 SDK・ メモリー解放ができません。】
http://www.fxug.net/modules/xhnewbb/viewtopic.php?viewmode=thread&topic_id=3741&forum=19&post_id=14881#14881

でdshさんとkacchan6さんお二人が投稿していらっしゃるので要リロードはやむ終えないということになりそうですが。

申し訳ありませんが、ご回答宜しくお願いします。
masu567
投稿日時: 2011-3-2 20:54
やや お馴染みさん
登録日: 2011-3-1
居住地: 関東
投稿: 6
Re: 連続稼動でsetTimeout関数が途中で止まってしまう
kacchan6さん回答ありがとうございます。

プロファイラですね。
名前を聞いたことはありますが、実際使用したことがありませんので、まずは調べることからはじめたいと思います。

>25日連続稼動については、FlashPlayerの仕様ですので、
諦めてリロードするようにしたほうが良いと思います。

仕様ですか・・・うむ困りましたね。
リロードが嫌であれば、for文等でTimerを使用しない独自ロジックを
作成して対応しなければいけないですね。

了解しました。回答ありがとうございました。
dsh
投稿日時: 2011-3-3 9:28
ご主人様
登録日: 2006-3-29
居住地: 東京
投稿: 296
Re: 連続稼動でsetTimeout関数が途中で止まってしまう
引用:
今回dshさんが提供頂いたソースはTimer関数で、1回だけの処理を何度も繰り返す形になると思うので、Timerの2^31の影響がないように思えるのですが、
今回のソースだったとしても365日稼動の弊害24.85日間のFlashPlayerの仕様(要リロード)は避けられないのでしょうか?
そうですね、タイマーが一回だけしか回らないので、約25日連続でタイマーを動かし続けるとおかしくなる問題の影響はないです。この実装なら、ブラウザのリロードをかけなくても良いと思います。
ただ、ブラウザのリロードをかけると、仮にメモリリークが起きていてメモリを大量に消費していたとしても、(FLEXコンテンツは)一旦リセットされ最初から動くことになるので、メモリが開放され、とりあえずの対処になります(あまり考えたくはないことだと思いますが)


----------------
http://shield.jp/blog/
Twitter: @dseg

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を