ボタン設定で見かけるあのオプション。
みなさん、どう動くかご存知でしたか?
何気なく、何も設定せずにそのまま使っている方、いらっしゃいませんか?
不覚にもこのオプションの不理解が災いして、えらい解析に時間がかかったことがありました。
「おかしい。。。」処理は終了しているはずなのに、何かが動いている。。。
その時はお客様の現場で、Advancedバージョンではなかったため、デバッガが使えず、実装の内容と動きからしか現象を確認することができませんでした。
そして、ふと気が付いたのです。
ボタンのオプション、全部スクリプトが止まる設定になってない!!!
ボタンのオプションを修正する1秒の作業で、長かった調査を終えることができましたとさ。
ので、今回はこのオプションの動きをまとめていこうと思います。
テストスクリプト
2つのスクリプトを用意しました。
↓ボタンをクリックするとメッセージが出るスクリプト:dispMsg
↓ボタンをクリックする前から動いているスクリプト:script一時停止
ボタンのオプション設定
4つのボタンオプションを設定したボタンをそれぞれ用意します。
(1)デフォルトで指定されている「現在のスクリプトを一時停止」
(1)デフォルトで指定されている「現在のスクリプトを一時停止」
では、早速テストしてみます。
「script一時停止」スクリプトを実行しておきます。
「script一時停止」スクリプトは、「dispMsg」スクリプトが終わっても、続いています。
「script一時停止」スクリプトをその段階で一時停止して、「dispMsg」を実行します。その後、また「script一時停止」スクリプトを実行し続けます。
(2)「現在のスクリプトを再開」
では、次に再開するパターンです。
同じく「script一時停止」スクリプトを動かしておき、「dispMsg再開」ボタンをクリックします。
「script一時停止」スクリプトは、「dispMsg」スクリプトが終わったら次のステップを実行します。
つまり、「script一時停止」スクリプトを再開して、進む、ということですね。
(3)「現在のスクリプト終了」
次は、スクリプト終了です。
「dispMsg」スクリプトを実行後、、、
次のステップに進まず、即終了です。
ちなみにここで「script一時停止」スクリプトを2個動かしておいた場合、1個のスクリプトが即終了し、残りのスクリプトは続きます。
どういう順番で実行が行われ、何が先に実行・終了するかは、デバッガ(Advancedの機能)のコールスタックを見るとわかります。
下のケースは、
1.script一時停止を実行
2.script一時停止 2を実行
3.ボタンに実装したdspMsg実行
の順番です。
最初に実行した順番に箱にスクリプトが入っていき、最後に入れた順番から処理が終了していく、という事になります。
簿記的にいうと、「先入れ後出し」というところでしょうか。
(4)「現在の全スクリプト終了」
最後に、全スクリプト終了するケースです。
メッセージを出した後、、、
(3)「現在のスクリプト終了」と同じように「script一時停止」スクリプトは次のステップに進まずに即時終了します。
ではなぜ(3)と(4)のケースがあるのでしょう。
これは、複数のスクリプトをバックグラウンドで動かしているとわかります。
(3)の場合は、1つの実行スクリプトが終了しますが、(4)の場合はバックグラウンドで動いている「全ての」スクリプトが即終了するのです。
まとめ
このオプションの動きを理解していないと、いつまでも動き続けるスクリプトが存在する。。。ゾンビ!?と思わせるような結果になてしまいますので、ボタンのオプションは状況に合わせて使い分けましょうね。(私含む)