※ ChatGPTを利用し、要約された質問です(原文:条件により処理を中断させる方法)
処理を中断させる方法
このQ&Aのポイント
質問文章において、ある条件のときに処理を中断する方法について説明します。
処理の外部の状況を条件にして、処理を中断させる方法について解説します。
特定の条件を満たした場合、処理を中断する方法について詳しく説明します。
下記のようなコードで、ある条件のときに処理を中断するという処理を書きたいと思っています。条件はループ処理の中で変化する変数の状態を検知するのではなく、処理の外部の状況を条件にしたいと思っています。
例えば「1秒たっても終わっていなかったら中断」という様にしたいと思っています。
※最初は「特定のキーが押されたら中断」などというようにしたかったのですが。
しかしうまくいきません…。下記のコードではIE8, FirFox, Chromeすべて駄目でした。とりあえずIE8だけでも、さらに言えばHTA限定でもOKです。
何とかならないものでしょうか?「このような処理は不可能だ」という情報でも、あきらめることができるためありがたいです。
よろしくお願いします。
<html>
<input type="button" id="btn">
<script>
document.getElementById("btn").onclick = function() {
var flg = false;
var tid = window.setInterval(function() {flg = true;}, 1000);
for (var i = 0; 80000 > i; i++) {
if (flg) {
window.clearInterval(tid);
alert("break");
break;
}
document.getElementById("btn").value = i;
}
alert("finish");
};
</script>
</html>
お礼
今私の書いたコードを振り返るとなぜsetIntervalなのか意味不明ですね。 #var tid = window.setInterval(function() {flg = true;}, 1000); ここには最初は一定間隔ごとにキー入力を検知するコードが入っていました。という言い訳をしておきます…。 教えていただいたコードでは、ビジーループを防ぐためのコツがよくわかりました。元の処理の構成をほぼ変えずに問題を回避しているので勉強になりました。 補足欄に結果を書きました。もともとはループの中に関数を渡してその関数の処理時間の計測をしたかったので、こんなに処理時間が異なってしまうのは困るのですが、画面描画を含む処理をさせた場合にはこちらのほうが本来の姿なのかもしれませんね。 教えていただいたコードを参考にし、画面描画のコストも考慮にいれ、実装を考えてみたいと思います。 大変参考になりました。ありがとうございました。
補足
比較結果 ◎共通条件 ループ回数=1000 タイムアウト処理なし ◎もとのコード 処理時間IE8/FireFox/Chrome:1秒未満 ブラウザへの描画:NG(最後だけしか反映されない) すべてのブラウザで割り込み不可 ◎教えていただいたコード 処理時間IE8:15秒程度 処理時間FireFox:9秒程度 処理時間Chrome:6秒程度 ブラウザへの描画:OK すべてのブラウザで割り込み可 待ち時間とブラウザへの描画を除いた内部の処理で言えば、ほぼ同じはずだと思います。なので1000回のブラウザへの描画だけで14秒もの時間がかかっているのだと思います(IEの場合)。