- PR -

javascriptでのclearInterval(Timer)に関して

1
投稿者投稿内容
豊樹
会議室デビュー日: 2005/06/01
投稿数: 6
投稿日時: 2005-06-01 16:22
はじめまして。

javascriptでclearInterval(Timer)した場合、常にではない
のですがたまにタイマーが解除されずscriptが永久ループしてしまう
現象が発生しているのですが
タイミングなどの問題でこのような現象になることはなにか考えれな
いでしょうか?

よろしくお願いいたします。

冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2005-06-01 17:23
引用:

javascriptでclearInterval(Timer)した場合、常にではない
のですがたまにタイマーが解除されずscriptが永久ループしてしまう
現象が発生しているのですが
タイミングなどの問題でこのような現象になることはなにか考えれな
いでしょうか?


タイマーを解除すれば解除されるはずですよ。
解除したと思ったのに解除されていないというのなら、作ったscriptのバグというだけです。

そうじゃなくて、ブラウザのバグだと思っているのでしたら、ブラウザの名前も書かかれていない状態では誰も返答出来ないかと思います。

(要するに、今の状態だと問題のあるスクリプトもブラウザも分からないので誰も答えようが無い、という事。)
(質問する時には、自分の質問を見て「どういう風に答えられるかな?」と考えながら質問を練ってみて下さい。自分の質問が理解出来るようになる頃には、大抵自己解決しています。)
豊樹
会議室デビュー日: 2005/06/01
投稿数: 6
投稿日時: 2005-06-03 09:51
提供情報が少なく申し訳ありませんでした。

上記現象が発生している使用しているブラウザはIE6です。
(その他のブラウザでは未確認。というのは常にこの現象が出るのではなく
 業務運用の中で1日に一回出るかでないかくらいの現象のため現在確認で
 きているブラウザはIE6になります。)

スクリプトは

-------------------------------------------------------------------------

function onLoadBody()
{
if(setInitialDetails() == false){
eleTimer = setInterval("setInitialDetails()",500);
}
}

function setInitialDetails(){

// タイマーがセットされていればカウントアップ
if(eleTimer != null){
iTimerCnt++;
if(iTimerCnt == 10000){
clearInterval(eleTimer);
return;
}
}

// すべてのフレームがロードされているかをチェック
if(parent.iStandFlg_All != 1){
return false;
}

// タイマーがセットされていればタイマーの解除
if(eleTimer != null){
clearInterval(eleTimer);
}

以下業務処理が記述されています。
 (この処理が永久にループしているように動いています)

}

------------------------------------------------------------------------

このようなロジックで永久ループが発生しています。
(上記でも記述しましたが大抵はきちんと動作したまに永久ループに入る
 ことがある)

ロジック上ではほぼ動くように見え、必ず起きるわけでもないのでロジック
以外でなにか原因は考えられないかなと思っています。

以上です。よろしくお願いいたします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-06-03 10:06
OSはWinXP SP2ではありませんか?
おそらく、clearIntervalが正常に動作してないのではなく
フレームの読み込みフラグであるparent.iStandFlg_Allが1にならずに
clearIntervalが呼ばれていないはずです。ためしに、clearIntervalを呼んでる場所で
alertでメッセージを出力するようにして、試してください。
私も同様の現象に陥ったことがあります。発生するのはWinXP SP2の環境のみでした。
かなりの時間を調査に費やしましたが、結局原因はわかっておりません。
ただ、クライアントPCを再起動して、一回目のページ表示の際に発生する確率が高いようです。(意味わからん。。。)
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2005-06-03 11:09
引用:

OSはWinXP SP2ではありませんか?
おそらく、clearIntervalが正常に動作してないのではなく
フレームの読み込みフラグであるparent.iStandFlg_Allが1にならずに
clearIntervalが呼ばれていないはずです。


成る程〜。うちではSP2の実験環境が無いので(汗)全く推測しか出来ませんが、SP2では色々セキュリティに関して強化されたような話を聞くのでフレーム越しにアクセスするのが制限されてるとかあるのかもしれませんね。

後、豊樹さんのコードでちょっと気になった所
コード:
function setInitialDetails(){
    // eleTimerはこのスコープから必ず見えるようになっているのか?
    if(eleTimer != null){
        // 同じく、スコープを確認
        iTimerCnt++;
        // == だと万が一10000を超えた場合永久ループするので
        // iTimerCnt >= 10000 がいいと思う
        // (Cのコード等を見ると、よくこういう箇所を見かける)
        if(iTimerCnt == 10000){
            clearInterval(eleTimer); 
            return; 
        } 
    } 

豊樹
会議室デビュー日: 2005/06/01
投稿数: 6
投稿日時: 2005-06-06 11:29
お世話になっております。豊樹です。

>フレームの読み込みフラグであるparent.iStandFlg_Allが1にならずに
>clearIntervalが呼ばれていないはずです。

この場合は、

if(parent.iStandFlg_All != 1){
return false;
}

としているので、そこまでのロジックで永久ループしてしまうと思います。
現在はその下のほうの業務ロジックの部分まで動作(永久ループ)してしま
っているのが現状です。。。
なのでparent.iStandFlg_Allは1になっているのではと思っています。

ただしその場合、その下で

// タイマーがセットされていればタイマーの解除
if(eleTimer != null){
clearInterval(eleTimer);
}

としているのでタイマーは解除されるはずなのに、解除されていないように
動作(永久ループ)してしまっているので困っております。

初めの説明がわかりにくく誤解を招いてしまい申し訳ありませんでした。

以上です。よろしくお願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-06-06 11:43
引用:

parent.iStandFlg_Allは1になっているのではと思っています。



Alertなどを使用して確認しましたか?
デバッグするうえで、「〜だと思う」というのはいただけません。
ちゃんと確かめて、一つ一つ潰していきましょう。
1

スキルアップ/キャリアアップ(JOB@IT)