[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.7 遅延実行のためのタイマ

未来のある時刻に関数を呼び出したり、 ある一定期間なにもしないでいたら関数を呼び出すために タイマを設定できます。

Emacsは、Lispプログラムの任意の箇所ではタイマを実行できません。 サブプロセスからの出力を受け取るときにだけタイマを実行できます。 つまり、待つことが可能sit-forread-eventなどの 基本関数の内側や(入力を)待っているあいだに実行できます。 したがって、Emacsが忙しいとタイマの実行が遅れることがあります。 しかし、Emacsが暇ならば、タイマの実行はとても正確です。

Function: run-at-time time repeat function &rest args
この関数は、時刻timeに引数argsで 関数functionを呼び出すように予約する。 引数functionはのちに呼び出される関数であり、 引数argsはそれを呼び出すときに与える引数である。 時刻timeは文字列で指定する。

絶対時刻をさまざまな書式で指定できる。 この関数は、よく使われる日時の書式を受け付けるように努める。 正しい書式にはつぎの2つを含む。

 
year-month-day hour:min:sec timezone

hour:min:sec timezone month/day/year

ここで、どちらの例のフィールドもすべて数である。 current-time-stringが返す書式、および、 他の書式も許される。

相対時刻を指定するには、単位を伴った数字を使う。 たとえばつぎのとおり。

`1 min'
今から1分後。
`1 min 5 sec'
今から65秒後。
`1 min 2 sec 3 hour 4 day 5 week 6 fortnight 7 month 8 year'
今からちょうど103ヵ月、123日、10862秒後。 (12)

timeが数(整数か浮動小数点数)であれば、 秒単位の相対時刻を指定する。

引数repeatは、呼び出しをどの程度頻繁に繰り返すかを指定する。 repeatnilであると、繰り返さずに 時刻timeに関数functionを一度だけ呼び出す。 repeatが数であると、繰り返し間隔を秒単位で指定する。

ほとんどの場合、最初の呼び出しではrepeatの効果はなく、 timeだけが時刻を指定する。 1つ例外があり、timetであると、 時刻がrepeatの整数倍であるとタイマを実行する。 これはdisplay-timeのような関数に有用である。

関数run-at-timeは、予約した未来の特定の動作を 識別するタイマを返す。 この値は、cancel-timer(下記参照)の呼び出しに使える。

Macro: with-timeout (seconds timeout-forms...) body...
bodyを実行するが、seconds秒でその実行を諦める。 時間が切れるまえにbodyが終了すると with-timeoutbodyの最後のフォームの値を返す。 しかし、時間が切れるとbodyの実行を取り止め、 with-timeouttimeout-formsをすべて実行し、 それらの最後の値を返す。

このマクロは、seconds秒後に動作するタイマを設定することで動作する。 その時間内にbodyが終了すれば、タイマを取り消す。 タイマが実際に動作するとbodyの実行を終了させてから、 timeout-formsを実行する。

プログラムから待つことが可能な基本関数を呼び出したときにのみ、 タイマはLispプログラム内で実行可能なため、 with-timeoutbodyの計算途中では bodyの実行を停止できない。 それらが待つことが可能な基本関数の1つを呼び出したときにのみ停止できる。 したがって、長い計算を行わない入力を待つようなbodywith-timeoutを使う。

関数y-or-n-p-with-timeoutは、 応答を長く待ちすぎないようにタイマを使った単純な例です。 See section 19.6 Yes/Noの問い合わせ

Function: run-with-idle-timer secs repeat function &rest args
Emacsがsecs秒間なにもしないときに実行するタイマを設定する。 secsの値は整数でも浮動小数点数でもよい。

repeatnilであると、 これ以降にはじめてEmacsが十分長い期間なにもしないでいると、 タイマを一度だけ実行する。 しばしばrepeatnil以外であり、 Emacsがsecs秒なにもしないでいるたびに タイマを実行することを意味する。

関数run-with-idle-timerは、 cancel-timer(下記参照)の呼び出しに使えるタイマの値を返す。

Emacsがユーザー入力を待ち始めると『アイドル状態』になり、 なにか入力がくるまでアイドル状態のままです。 5秒間のアイドル状態で動作するタイマがあったとすると、 Emacsがアイドルになってから約5秒後にそのタイマが実行されます。 しかしrepeatが真(nil以外)であったとしても、 そのタイマはEmacsがアイドル状態であり続ける限りは再実行されません。 アイドル状態の期間は単調に増加するので、再度5秒後には戻りません。

Emacsがアイドル状態のときにはさまざまなことを行います。 ガベッジコレクション、自動保存、サブプロセスからのデータの処理です。 しかし、アイドル状態中のこれらの動作はアイドルタイマに干渉しません。 アイドル状態の時間を0にしないからです。 600秒に設定されたアイドルタイマは、 最後のユーザーコマンドを終了してから10分後に実行されます。 たとえその10分間に、サブプロセスの出力を何千回も受け取ろうが、 ガベッジコレクションや自動保存を行ったとしてもです。

ユーザーが入力を与えると、その入力を実行中はEmacsは非アイドル状態です。 そして再度アイドル状態になり、 繰り返すように設定されたアイドルタイマを1つずつそれ以降に実行します。

Function: cancel-timer timer
タイマtimerの予約を取り消す。 timerは、以前にrun-at-timerun-with-idle-timerが返した値であること。 これは、run-at-timeの呼び出しの効果を取り消し、 その時刻になってもなにも特別なことは起こらない。



This document was generated by Takeshi Sasaoka on , 21 2002 using texi2html