ログイン
ユーザ名:

パスワード:


パスワード紛失

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

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
kacchan6
投稿日時: 2011-3-4 2:16
ご主人様
登録日: 2009-10-15
居住地:
投稿: 167
Re: 連続稼動でsetTimeout関数が途中で止まってしまう
引用:

お客様にリロードをお願いするは少し気が引けていまして・・・。

いや、お客さんにリロードボタン押してねとお願いしなくても、
ブラウザ上での実行ならば、定期的に実行時間を見て、
ExternalInterface.call("location.reload");
を実行すればリロードされますよ。
スタンドアロンプレイヤーなら厳しいと思いますけど。
masu567
投稿日時: 2011-3-3 23:02
やや お馴染みさん
登録日: 2011-3-1
居住地: 関東
投稿: 6
Re: 連続稼動でsetTimeout関数が途中で止まってしまう
返事が遅くなって申し訳ありません。

よかったです。色々な諸事情により
お客様にリロードをお願いするは少し気が引けていまして・・・。
差当り、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

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

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

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

仕様ですか・・・うむ困りましたね。
リロードが嫌であれば、for文等で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さんお二人が投稿していらっしゃるので要リロードはやむ終えないということになりそうですが。

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

25日連続稼動については、FlashPlayerの仕様ですので、
諦めてリロードするようにしたほうが良いと思います。
Tweenライブラリを使わない、Timerを使わないなら問題ないかもしれませんが。
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さん貴重な情報ありがとうございました。
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 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;
}

投稿頂いた上に、更なるお願いで申し訳ありませんが
よろしければソースの確認及びご指摘をして頂けると嬉しく思います。
宜しくお願いします。
kacchan6
投稿日時: 2011-3-2 12:10
ご主人様
登録日: 2009-10-15
居住地:
投稿: 167
Re: 連続稼動でsetTimeout関数が途中で止まってしまう
自分も原因不明ですが、setTimeoutが効かないことがありました。
そのときは高負荷のときでしたが、とりあえずEnterFrameで時間計測して逃げました。

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

ちなみに、約25日で内部タイマーが31bit(符号付き整数の最大値)を超えて動かなくなるようです。
連続稼動を前提とするにしても、途中でプレイヤーをリロードしてやるとかも必要です。
(1) 2 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を