• ベストアンサー

setTimeoutあるいはsetIntervalの限界

いつもお世話になっています。 タイマーの実験をしてみようかと思い、タイマー関数のサンプルをちょっと触ってみて、気になることがありました。 スクリプトとしては、次のようなものです。 <HTML> <HEAD> <SCRIPT Language="JavaScript"> <!-- timerID = 10; count = 0; function timerX(){ status = "Counter is " + count++; } function clr(){ clearInterval(timerID); } // --> </SCRIPT> <BODY bgColor="white" onLoad="timerID = setInterval('timerX()',1000);"> (以下略) このスクリプトを実行すると、1秒毎に1カウント増えていきますから、ステータスに表示される数値は10秒で10になります。 ですから、1を指定する、つまりsetInterval('timerX()',1);にすれば、論理上、10秒で10000になるはずですよね? ところが実際にステータスに出る数値はそうはならず、かなり低い数字になってしまいます。 そこで質問なのですが、setTimeoutまたはsetIntervalでタイマーを作る場合、ミリ秒はどのくらいまで有効なのでしょうか。 ひょっとして、マシンに依存するのでまちまちなのでしょうか。 経験等でご存じの方、お教えください。

質問者が選んだベストアンサー

  • ベストアンサー
  • zzzzzz
  • ベストアンサー率61% (70/113)
回答No.1

環境に依存すると思います。 推測ですが、setIntervalの処理は例えばWindowsですと、Windowsのタイマーを使用して実装していると思われます。 その場合には、メッセージキュー内でのWM_TIMERメッセージの優先度が低いために、 実際にウィンドゥプロシージャが1ミリ秒ごとにWM_TIMERを解釈してtimerX()関数の処理をするわけではない、というのがおそらく原因でしょう。 このことは、他のプログラムを実行しながらこのカウンタを回すと、カウントされる数値がさらに小さくなることと合致します。

参考URL:
http://www.microsoft.com/japan/developer/library/jpuipf/_win32_settimer.htm
dai-39
質問者

お礼

解答ありがとうございました。 お返事が遅れて申し訳ありません。 OS自身のタイマー優先度に依存している、ということはスクリプトを組む側からはどうしようもない、ということかも知れません。 ただ、それならばなぜ、ミリ秒単位まで指定することが可能なのかが疑問です。 こういうことは仕方のないことなのでしょうか? #まあこの辺になるとOSの開発者の問題とかになるのかな。(^^;;)

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • A__
  • ベストアンサー率47% (22/46)
回答No.2

有効な値はないと思います。 例えば、WinNT が0.0111秒ごとに動作できるとしたら、 JavaScript で0.001秒ごとの処理をしようと思っても、 0.0111 と 0.001 の歯車はうまくかみ合わない。 JavaScript で指定する値にゆとりを持たせて10秒を指定しても、 0.0111 と 10 の歯車はうまくかみ合わない。 setInterval('timerX( )',1000) は、1秒ごとに動作するけど、 ループによる次の setInterval( ) の実行の時は、初回の時の 時間を参考にせず、前回の実行から1秒後に timerX( ) を 実行しているんだと思う。 初回の時の時間を参考にしていないから、setInterval( ) が 実行されるたびに、実際の時間とのずれが蓄積されていくんだと思う。 時間のずれは発生するから、setInterval( ) でのループを 1000回ぐらいやったら、もう一度時間を取得しなおす とかすれば、そこそこいい結果になると思います。 setInterval('timerX()',1) のような高速処理をされるなら、setTimeout( ) の方がよさそうです。 setTimeout( ) を for( ) でループされるとか。 setTimeout( ) の方が処理が軽いらしく、高速処理ができます。

dai-39
質問者

お礼

解答ありがとうございました。 今度、forでくくって実験してみようと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • setIntervalについて

    お世話になります <script type="text/javascript"><!-- window.onload=function() { n=0; Timer = setInterval("ch()",1000); } function ch() { n++; document.getElementById("test").innerHTML = n; } function re() { clearInterval(Timer); } function call() { Timer = setInterval("ch()",1000); } //--></script> <input type="button" onclick="re()" value="reset"> <input type="button" onclick="call()" value="call"> <div id="test"></div> としたときにページを表示したら1秒ごとに<div>『test』に1ずつ数が増えて表示されていき『reset』ボタンを押すとTimerが止まり『call』ボタンを押すとTimerが再開します でもTimerを解除せずに『call』ボタンを押すと1秒に2ずつ、3ずつという風に相乗されていきます(新しいTimerが追加されていく) これをTimerが起動しているときに『call』ボタンを押すとreturn false; 起動していないときにはTimerを起動させるという風にすることは可能でしょうか? (Timerが起動しているときに『call』ボタンを押せないようにする以外に)

  • JavaScriptのタイマーについて

    JavaScriptのタイマーについて上手く動作しないので質問させて頂きます。 <仕様>  3秒後に「aaa」のメッセージを表示させる。  5秒後に「aaa」のメッセージを表示させる。 <現在の状況>  3秒後に「aaa」のメッセージを表示し、その後は応答なし。 <ソース> 以下を参照ください。何が悪いのでしょうか? <HTML> <HEAD> <SCRIPT Language="JavaScript"> <!-- timerID = 10; function func() { alert("aaa"); } function init() { timerID = setTimeout("func()", 3000); timerID = setTimeout("func()", 5000); } // --> </SCRIPT> </HEAD> <BODY onload="init()"> </BODY> </HTML>

  • JavascriptのtimerIDの意味

    いつもお世話になっております。 現在、Javascriptの勉強をしており、その過程でカウントダウンタイマーを作成しています。 テキスト通りにsetTimeout()メソッドなどを使用しているのですが、timerIDの意味が理解できず困っております。 タイマーを識別するID番号ということはなんとなく理解できるのですが、下記コードのelse if (timerID)やtimerID=0とは何を意味しているのでしょうか。 if文の条件がtimerIDとはどういうことなのか。 timerIDの値を0にする必要性は何なのか。 教えてください。 <doctype! html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Javascript</title> <script type="text/javascript"> window.onload = init; function init(){ document.form1.start.onclick = start; document.form1.reset.onclick = stop; } var timerID; function start(){ count = parseInt(document.form1.time.value); if (count<=0){ count = 0; return; } else if (timerID){ count--; } document.form1.time.value=count; if (count==0){ clearTimeout(timerID); timerID = 0; alert("時間です"); return; } timerID = setTimeout("start()", 1000); } function stop(){ document.form1.time.value=0; if(timerID){ clearTimeout(timerID); timerID=0; } } </script> </head> <body> <h1>カウントダウンタイマー</h1> <form name="form1"> 時間<input name="time" type="text" size="3">秒<br> <input name="start" type="button" value="スタート"> <input name="reset" type="button" value="リセット"> </form> <script type="text/javascript"> </script> </body> </html>

  • 【jQuery】setInterval

    jqueryの初心者です。 3つの画像を3秒間隔でクロスフェードさせ、それを繰り返したいのですが setIntervalの使い方が違うのか、思うような動きになりません。 何が原因なのかと、無駄な部分があると思いますので なるべくシンプルで初心者レベルのコードを教えて頂きたいです。 宜しくお願いします。 $(function(){ setInterval(function(){ setTimeout(function(){ $(".photo-1").fadeOut(1000); },3000); setTimeout(function(){ $(".photo-2").fadeIn(1000); },3000); setTimeout(function(){ $(".photo-2").fadeOut(1000); },6000); setTimeout(function(){ $(".photo-3").fadeIn(1000); },6000); setTimeout(function(){ $(".photo-3").fadeOut(1000); },9000); setTimeout(function(){ $(".photo-1").fadeIn(1000); },9000); },3000); }); <div id="photo-box"> <p class="photo-1"><img src="img/01.jpg" width="500" height="150" alt="" /></p> <p class="photo-2"><img src="img/02.jpg" width="500" height="150" alt="" /></p> <p class="photo-3"><img src="img/03.jpg" width="500" height="150" alt="" /></p> </div>

  • setTimeoutを使った再帰

    初めて質問させて頂きます。 setTimeoutで呼び出してるか否かと、言う違いしか無いと、言う事を思いますが、次に挙げる2つのプログラムの動作が異なる理由をどなたかお教え頂けませんか? <script type="text/javascript"> <!-- var x; function FUNCTION1(){ x = 0; FUNCTION2(x); } function FUNCTION2(x){ if ( x < 10 ) { x++; window.alert(x); FUNCTION2(x); } } //--> </script> <body onload="javascript: FUNCTION1();"> ─────────────────────────── <script type="text/javascript"> <!-- var x; function FUNCTION1(){ x = 0; FUNCTION2(x); } function FUNCTION2(x){ if ( x < 10 ) { x++; window.alert(x); setTimeout("javascript: FUNCTION2(x);", 1000); } } //--> </script> <body onload="javascript: FUNCTION1();">

  • 数秒後に別フレームにとばす方法

    1フレーム目で画像を読み込み10秒表示させた後に2フレーム目でまた10秒表示させるといった事を試しています。 表示させる画像はムービークリップで最後の1秒でフェードアウトさせるようにしているのですが 完全にフェードアウトする前に2フレーム目に飛んでしまいます。 何か解決方法はないのでしょうか?? 1フレーム目 ---------------------------------------------------------- this.stop(); timerID = setInterval(startMovie, 10000); function startMovie() { clearInterval(timerID); gotoAndStop(2); } 2フレーム目 ---------------------------------------------------------- this.stop(); timerID = setInterval(startMovie, 10000); function startMovie() { clearInterval(timerID); gotoAndStop(1); } ちなみにgotoAndStop();を消すとそのフレームでループしますが完全にフェードアウトしてくれます…。

    • ベストアンサー
    • Flash
  • 一定時間が経過した後のフレーム移動について

    Flash初心者です。うまく質問したいことが伝わるか心配ですが、どうぞ宜しくお願いします。 タブメニュー型のムービーを作成していまして、10秒経過すると次のタブが開き、 また10秒すると次のタブが開く…。このループです。 タブの数は4つ。1フレームごとにそれぞれのタブが開いているように画像で見せておいて(計4フレームを使用)、 スクリプトで10秒の間隔をおき、次のフレームに移動させる仕組みになっています。 タブにはクリックできるようにボタンが仕込んであり、クリックするとムービーの流れ(再生されている順)に関係なく、 そのタブに移動します(2つ目のタブなら2フレーム目を再生)。 (タブの部分のテキスト、タブが開いたときに表示されるバナー画像は外部読み込みになっています。 ただ、この外部読み込みに関しては質問の内容に影響しないと思いますので詳しくは説明しないでおきます。) スクリプトは下記のとおりです。(注:教えて!gooにあったものを使わせていただきました。) ※1フレーム目 --------------------------------------------------------------------- this.stop(); timerID = setInterval(startMovie, 10000); function startMovie() { gotoAndPlay(2); clearInterval(timerID); } ※2フレーム目 --------------------------------------------------------------------- this.stop(); timerID2 = setInterval(startMovie2, 10000); function startMovie2() { gotoAndPlay(3); clearInterval(timerID2); } ※3フレーム目 --------------------------------------------------------------------- this.stop(); timerID3 = setInterval(startMovie3, 10000); function startMovie3() { gotoAndPlay(4); clearInterval(timerID3); } ※4フレーム目 --------------------------------------------------------------------- this.stop(); timerID4 = setInterval(startMovie4, 10000); function startMovie4() { gotoAndPlay(1); clearInterval(timerID4); } これでちゃんと10秒経過すると次のフレームに移動し、それがループされるのですが 問題は、途中で順に再生されているタブと違うタブをクリックしたときに起こります。 一度、その再生順がクリックすることによって変わってしまうと、元々の『10秒後に次のフレームへの移動』の動きと、 クリックされたタブから『10秒後に次のフレームへの移動』の動きが重複しているようなんです。 ちゃんと確認できたわけではありませんが、複数回これを繰り返すと4つのタブがかなりの速度でパッパッパと遷移し、 まともに見ることすらできないものになってしまいます。 解決したいのは、クリックしたタブ(移動したフレーム)から新たに10秒がカウントされ、10秒後には次のフレームに移動し 10秒経過する前に他のタブをクリックしたときでも、そのタブ(フレーム)に移動してからまた新たに10秒がカウントされる…。 このようにするにはどうしたらいいでしょうか? どうぞご教示ください。

  • 同じ内容のスクリプトを同一ページに実装

    同じボタンを特定回数連続で自動クリックするjavascriptを組みました。 (スクリプト名 loadHello) 下記で問題なく動作しました。 <script type="text/javascript"> //Searchボタンを0.5秒ごとに12回クリック window.onload = function loadHello(){ var counter = 1; var timerId = setInterval(function(){  document.getElementById('search_button').click(); if(counter >= 12){ clearInterval(timerId); } counter++; }, 500); } </script> <form id="searchform" name="searchform" method="POST"> <input type="hidden" name="play" id="play" value=""> <a id="search_button">search_button</a> </form> 次に、同じページに同様の働きをするloadHello2を組みました。 <script type="text/javascript"> //Searchボタンを0.5秒ごとに12回クリック window.onload = function loadHello2(){ var counter2 = 1; var timerId2 = setInterval(function(){  document.getElementById('search_button2').click(); if(counter2 >= 12){ clearInterval(timerId2); } counter2++; }, 500); } </script> <form id="searchform2" name="searchform2" method="POST"> <input type="hidden" name="play" id="play" value=""> <a id="search_button2">search_button2</a> </form> 上記のloadHelloとloadHello2を同じページに記載すると、なぜかloadHello2だけしか動作しません。 単純なミスと思いますが、ご指導いただきたくお願いいたします。

  • リアルタイムに時計を表示するときのsetIntervalについて

    いつもお世話になっています。 いつも以上に稚拙な質問で申し訳ないのですが、ご助力願います。 <html> <head> <script type="text/javascript"> <!-- var today = new Date(); window.onload = function dispTime(){ document.getElementById("showTime").innerHTML = today.getFullYear() + "/" + (today.getMonth()+1) + "/" + today.getDate() + " " + today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds(); setInterval('dispTime()',1000); } //--> </script> </head> <body> <div id="showTime"></div> </body> </html> できるだけ<body onload="">を使いたくないので、window.onloadにしてあります。 イメージとしては、document.getElementById("showTime").innerHTMLでshowTimeに時間が表示され、setIntervalで再度disptimeが呼ばれ、という無限ループになればよいと考えてこのソースになりました。 ただ現状は、ロード時に時刻が表示され、そのまま動きません。 たぶんsetIntervalの場所とか使い方がおかしいような気がするのですが、どうもよくわかりません。 参考にしたサイトによってsetInterval("dispTime()"...だったり setInterval("disptime"...だったりと記述がバラバラで、 ほとんどのところでは、body onload="setInterval("...とonload扱いでした。 body onloadは使わずに、1秒ごとに動く時刻表示をするには、どこを直せばよいでしょうか。 よろしくお願いします。

  • setTimeoutでの制御に関しまして

    初めて質問をさせて頂きます。よろしくお願い致します。 「mc_Image1」、「mc_Image2」、「mc_Image3」という 各ムービークリップをストップボタンを押した際に時間差で停止させたいのですが 「mc_Image2」、「mc_Image3」がstopがかからない状態が稀に生じたりします。 (ムービークリップは全て、1フレーム目にstop();、10フレーム目にgotoAndPlay(2);と設定) 少し端折っておりますが、スクリプトを記載いたします。 ---------------------------- //何回ルーレットしたかカウントする var count:Number = 0; //スタート/ストップボタンが押された押されていないかのフラグ var flg_StartStop:Boolean = false; // mc_Image停止待機速度変数(ミリ秒) var hensu1 = 2000; var hensu2 = 3000; //スタート/ストップボタンを押した時に呼び出される関数 btn_StartStop.onPress = function() { if(flg_StartStop) { //選ばれたフレームに飛ぶ mc_Image1.gotoAndStop(parseInt(one)+1); // setInterval で hensu(ミリ秒)後に_root.gotoAndStop(); を実行 stopID = setInterval(function () { _root.mc_Image2.gotoAndStop(parseInt(two)+1); clearInterval(stopID); }, hensu); stop2ID = setInterval(function () { _root.mc_Image3.gotoAndStop(parseInt(three)+1); clearInterval(stop2ID); }, hensu2); //押されたかどうかの変数を「偽」に flg_StartStop = false; //カウンタを増やす count++; } else { //ムービークリップを走らせる mc_Image1.play(); mc_Image2.play(); mc_Image3.play(); //押されたかどうかの変数を「真」に flg_StartStop = true; } } ---------------------------- 。 きちんと「gotoAndStop();」させるにはどのように対処すれば よろしいでしょうか。 不足がございましたら申し訳ありません。 何卒よろしくお願い致します。

このQ&Aのポイント
  • 4月7日にいただいたお花の名前がわかりません。似た花がたくさんある中で、アイリスなのかどうか判断がつきません。違いを教えていただけないでしょうか。
  • 4月7日にいただいたお花の名前を知りたいです。アイリスという花の他にも似た花がいくつかありますが、どのような違いがあるのか教えていただけますか?
  • 4月7日にもらったお花の名前が分かりません。アイリスに似ている花がたくさんあるので、どの花なのか判断ができません。知識のある方から教えていただきたいです。
回答を見る

専門家に質問してみよう