AppleScriptでwaitを入れる

AppleScriptでwaitを入れる(一定時間待つ)処理については、1993〜1994年のAppleScript登場当初から標準装備されている「delay」コマンドで行えるわけですが、意外と知られていないようです。

  delay 数値

で、指定秒数だけ待ちます。この、一見何をするでもない「待つ」という処理が、実はものすごく重要でさまざまな問題の解決方法になることがあります。とくに、アプリケーションに対してイベントを送って命令するAppleScriptのような処理系になれば、なおさらです。

コマンドを送ったけれど、相手側のアプリケーション内部の計算が間に合わない。だけど、アプリケーション側はコマンド実行に対して「OK」の応答をすでに行ってしまい、それを真に受けて次の命令を実行すると期待どおりの結果が得られなかったりエラーになったりする………そこで、マシンの処理性能とアプリケーションの処理内容を勘案して適度にdelayコマンドでウェイトを入れると……何事もなかったかのように処理を実行できる。そんな場面に遭遇したことが何度かあります(GUI Scriptingにその傾向が強い)。

なお、昔はdelayコマンドで整数値しか指定できませんでしたが、いまは0.1刻みで小数の値も指定できるようになっており、

 delay 0.1

といった記述もできます(AppleScriptのdateオブジェクトで秒単位以下の時間計測は行えないので、本当に0.1秒待っているのかは不明)。

Intel MacになってAppleScriptの処理速度が大幅に向上したこともあり、delayに小数値が指定できるようになったことは意義深いのですが、そうであればなおのこと、タイマ割り込み用のon idleハンドラで小数単位での秒数間隔の割り込みが入れられるようにしてほしいものです。

AppleScriptObjCではon idleハンドラそのものではないものの、小数秒単位での割り込みルーチンなどがAppleScriptだけで実装した例も発表されており、実際にサンプルでテストしてみたりしていますが…………やっぱり、AppleScriptで0.1秒間隔の割り込みを入れると処理が重くなって、CPUのロードアベレージが20%程度(Core 2 Duo 2.4GHz)は行ってしまうので、やや抑え気味に0.2秒単位での割り込みで抑えていたりします。

Leave a Reply