| Minervqはタイマー処理をサポートします。
タイマー処理をサポートする述語群があります。
- timer_create/2
- timer_close/2
- timer_start/2
- timer_stop/1
- timer_is_active/1
タイマーを作り、消去し、開始させ、停止することができます。タイマーの
現状(進行中か停止中かのどちらか)をチェックすることができます。
タイマーに投げかけられるユーザ定義のコールバック述語を作ることができます。
タイマーが停止した時に、このコールバック述語が呼ばれます。
個々のタイマーは、スレッドとして実装されます。
それにより、タイマーのコールバックは非同期的に開始させることができます。
しかし、Minervaはマルチスレッドはサポートしていません。
(つまり、Minervaは同時に一つのゴールしか実行しません。)
一つのゴールの実行が終了したときに初めて、次のゴール(他のスレッドから
呼び出されたゴールである可能性もあります。)を実行させることが可能です。
それゆえに、タイマーサポートが必要な際は、プログラムは以下のような構成
にせねばなりません。
main(..) :-
...
timer_create(mycallback(_,...), Timer),
...
timer_start(Timer, T).
mycallback(Timer, ...) :-
...
プログラムを実行するときには、-daemonのフラグを付けて、Minervaを
呼び出さねばなりません。これによって、main/1述語が実行されている
最中に、その実行を停止することがありません。Minervaはすべてのスレッドが
停止したときに初めて、停止します。
例
main(_) :- ticker.
ticker :-
set_global(ticker, 10),
% create a timer, that should call tick/1 when running down
timer_create(tick(_), Timer),
% start the timer ...
timer_start(Timer, 1000).
% ... and (very important!!) ... stop the execution of main/1
tick(Timer) :-
count_down(ticker, N),
( N > 0 ->
% write 'tick' ...
write(tick), nl,
% .. and restart the timer ...
timer_start(Timer, 1000)
% ... and (very important!!) ... stop the execution of tick/1
% as the execution of the callback predicate will be pending
% until the execution of tick/1 has been finished
; timer_close(Timer)
).
count_down(Counter, Value) :-
get_global(Counter, OldValue),
Value is OldValue - 1,
set_global(Counter, Value).
|