• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:条件により処理を中断させる方法)

処理を中断させる方法

このQ&Aのポイント
  • 質問文章において、ある条件のときに処理を中断する方法について説明します。
  • 処理の外部の状況を条件にして、処理を中断させる方法について解説します。
  • 特定の条件を満たした場合、処理を中断する方法について詳しく説明します。

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

  • ベストアンサー
回答No.1

ビジーループになっているので途中で他の非同期処理が割り込めないために 処理が停止できないのだと思います。 ループ自体を非同期処理にして適度にintervalによるwaitを入れてあげれば 反応するようになりますね。 こんな感じです。 <html> <input type="button" id="btn"> <input type="button" id="stop" value="stop"> <script> document.getElementById("btn").onclick = function() { var flg = false; var i = 0; var timeoutTimer = window.setTimeout(function() {flg = true;}, 1000); document.getElementById("stop").onclick = function() {flg = true;}; var loopInterval = window.setInterval(function() { document.getElementById("btn").value = i; if (flg) { window.clearInterval(loopInterval); alert("break"); return; } i++; if (i >= 80000) { window.clearTimeout(timeoutTimer); window.clearInterval(loopInterval); alert("finish"); return; } }, 1); }; </script> </html> ただ、1ループ毎に1ms以上のwaitが入ってしまうのでループの性能は劣化します。 setIntervalに渡す中身自体を数回で終わるループにして、waitする間隔を調整すれば多少改善するかもしれません。

pringlez
質問者

お礼

今私の書いたコードを振り返るとなぜsetIntervalなのか意味不明ですね。 #var tid = window.setInterval(function() {flg = true;}, 1000); ここには最初は一定間隔ごとにキー入力を検知するコードが入っていました。という言い訳をしておきます…。 教えていただいたコードでは、ビジーループを防ぐためのコツがよくわかりました。元の処理の構成をほぼ変えずに問題を回避しているので勉強になりました。 補足欄に結果を書きました。もともとはループの中に関数を渡してその関数の処理時間の計測をしたかったので、こんなに処理時間が異なってしまうのは困るのですが、画面描画を含む処理をさせた場合にはこちらのほうが本来の姿なのかもしれませんね。 教えていただいたコードを参考にし、画面描画のコストも考慮にいれ、実装を考えてみたいと思います。 大変参考になりました。ありがとうございました。

pringlez
質問者

補足

比較結果 ◎共通条件 ループ回数=1000 タイムアウト処理なし ◎もとのコード 処理時間IE8/FireFox/Chrome:1秒未満 ブラウザへの描画:NG(最後だけしか反映されない) すべてのブラウザで割り込み不可 ◎教えていただいたコード 処理時間IE8:15秒程度 処理時間FireFox:9秒程度 処理時間Chrome:6秒程度 ブラウザへの描画:OK すべてのブラウザで割り込み可 待ち時間とブラウザへの描画を除いた内部の処理で言えば、ほぼ同じはずだと思います。なので1000回のブラウザへの描画だけで14秒もの時間がかかっているのだと思います(IEの場合)。

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