イフコンピュータ > MINERVA > マニュアル > レファレンス > 述語 > 非同期タイマー処理へのサポート

非同期タイマー処理へのサポート

MINERVA
ifcomputer logo
f
Expert Services on the Web

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).

document: http://www.ifcomputer.co.jp/MINERVA/Manual/Reference/Predicates/timer/print_jp.html
published 2008/10/6 update 2002/3/20 (c) 1996-2006 IF Computer Japan
IF Computer 〒113-0022 Tel 03-5814-3352 start (AT) ifcomputer.com
Customer Support 東京都文京区千駄木5-28-2   http://www.ifcomputer.co.jp
戻る> managed with ubiCMS