For Development HEAD DRAFTSearch (procedure/syntax/module):

11.26 srfi.120 - タイマーAPI

Module: srfi.120

このsrfiは、タスクを指定した時間に実行するデバイスを提供します。

Gaucheではこれはcontrol.schedulerの薄いラッパーです。 (詳しくはcontrol.scheduler - スケジューラ参照)。このモジュールは移植性が必要な場合に利用すると良いでしょう。

Function: make-timer :optional error-handler

[SRFI-120]{srfi.120} 新たなタイマーを作って返します。error-handler引数は#fもしくは 引数をひとつ取る手続きです。手続きであれば、タスクのサンクがエラーを上げた時に、 投げられたコンディションを引数にして呼び出されます。その返り値は無視されます。 省略された場合は#fとされます。

Gaucheでは、返されるタイマーオブジェクトは<scheduler>のインスタンスで、 error-handler引数はerror-handlerスロットに渡されます。 詳しくはcontrol.scheduler - スケジューラを見てください。

Function: timer? obj

[SRFI-120]{srfi.120} objがタイマー (<scheduler>のインスタンス)であれば#tを、 そうでなければ#fを返します。

control.schedulerscheduler?と同じです (control.scheduler - スケジューラ参照)。

Function: timer-cancel! timer

[SRFI-120]{srfi.120} タイマーを止めます。まだ残っているタスクはもう実行されず、 また新しいタスクを登録することもできません。 一旦止められたタイマーをリスタートすることはできません。

タイマーのタスクがエラーを投げて、タイマーがerror-handlerを持っていないか、 あるいはエラーを処理したerror-handlerがその中でさらにエラーを投げた場合、 投げられたコンディションはタイマー中に保存され、この手続きからreraiseされます。

control.schedulerscheduler-terminate!も参照してください (control.scheduler - スケジューラ)。

Function: timer-schedule! timer thunk when :optional period

[SRFI-120]{srfi.120} thunkwhenで指定される時点に実行するタスクを作成します。 whenは正確な非負整数か、make-timer-deltaが返す時間差オブジェクト でなければならず、この手続きを呼び出した時点からの相対時間を指定します。 整数の場合はミリ秒単位です。

period引数が与えられてゼロでない場合、タスクは指定間隔で繰り返されます。 period引数もwhenと同様、非負整数のミリ秒か時間差オブジェクトです。 periodがゼロの場合はタスクは繰り返しません。

戻り値はタスクIDで、それを使ってタスクをリスケジュールしたり削除したりできます。 SRFIではタスクIDは「print可能であること」としか規定されていません。 Gaucheは整数を使っています。

註: Gaucheでは、時間差オブジェクトはSRFI-19のtime-durationタイプの <time>オブジェクトです。時間のタイプ参照。

この手続きはcontrol.schedulerscheduler-schedule!を 使って実装されています(control.scheduler - スケジューラ参照)が、 whenperiodの単位が異なっていることに注意してください。

Function: timer-reschedule! timer task-id when :optional period

[SRFI-120]{srfi.120} timer中でtask-idで指定されるタスクの実行時間を変更します。 task-idはこれ以前にtimer-schedule!timerに適用して 返されたオブジェクトでなければなりません。

whenperiodの意味はtimer-schedule!と同じです。

task-idに該当するタスクが無い場合 (一回きりのタスクとして既に実行されてしまって いる場合も含みます) にはエラーが投げられます。(srfiではこの場合の動作は規定されていません)

返り値はtask-idです。

この手続きはcontrol.schedulerscheduler-reschedule!を 使って実装されています(control.scheduler - スケジューラ参照)が、 whenperiodの単位が異なっていることに注意してください。

Function: timer-task-remove! timer task-id

[SRFI-120]{srfi.120} timer中の、task-idで指定されるタスクを取り除きます。 タスクが実際に取り除かれたら#tを、指定のタスクが存在しなければ#fを返します。

Function: timer-task-exists? timer task-id

[SRFI-120]{srfi.120} timertask-idで指定されるタスクを持っていれば#tを、 そうでなければ#fを返します。 繰り返さないタスクは実行されたらtimerから自動的に除かれます。

Function: make-timer-delta n unit

[SRFI-120]{srfi.120} 時間差オブジェクトのコンストラクタです。時間差オブジェクトはtimer-schedule!timer-reschedule!whenperiod引数に渡すことができます。

Gaucheでは時間差オブジェクトはtime-duration型の<time>オブジェクト のインスタンスです(時間のタイプ参照)。 このSRFIでは時間差オブジェクトの具体的な実装は指定されていないので、 ポータブルなコードではこの手続きを使って時間差オブジェクトを得るのが良いでしょう。

nは整数、unitは以下のシンボルのいずれかです: h (時間)、m (分)、s (秒)、 ms (ミリ秒)、us (マイクロ秒)、ns (ナノ秒)。

Function: timer-delta? obj

[SRFI-120]{srfi.120} objが時間差オブジェクトなら#tを、そうでなければ#fを返します。 Gaucheでは時間差オブジェクトはtime-duration型の<time>オブジェクトの インスタンスです。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT