Timer 如何在SWI Prolog上设置警报?

Timer 如何在SWI Prolog上设置警报?,timer,window,prolog,alarm,swi-prolog,Timer,Window,Prolog,Alarm,Swi Prolog,我正在试着制作一种能在5000毫秒后在屏幕上打印的东西。 我正在使用这段代码,5秒钟后Prolog关闭。 我要编译以下代码: :- use_module(library(time)). alarm:- alarm(5, writeln(ouch), Id, [remove(true)]). 报警机制通过发送信号来工作(请参阅线程信号/2)。只有当Prolog很好地运行一个目标时,信号才会被可靠地捕获。一些长期运行的外部目标明确查询挂起的信号。一些阻塞目标也可以处理它们,但这取决于操作系

我正在试着制作一种能在5000毫秒后在屏幕上打印的东西。 我正在使用这段代码,5秒钟后Prolog关闭。 我要编译以下代码:

:- use_module(library(time)).

alarm:-
   alarm(5, writeln(ouch), Id, [remove(true)]).

报警机制通过发送信号来工作(请参阅线程信号/2)。只有当Prolog很好地运行一个目标时,信号才会被可靠地捕获。一些长期运行的外部目标明确查询挂起的信号。一些阻塞目标也可以处理它们,但这取决于操作系统

处理计时的更可靠的方法是使用线程。例如:

?- thread_create((sleep(5), writeln(ouch)), _, [detached(true)]).
true.

?- outch
sleep :- sleep(1000), sleep.
或者,您必须确保发出警报的线程处于可以接收信号的状态。顶层不是(在所有平台上)。好了,睡眠/1是。因此,您可以确保线程正在运行(例如):


您使用的是哪个SWI Prolog版本?我使用的是6.6.6version@SergeyDymchenko你使用哪种版本的Prolog?Thanks@PedroSilvaLinux上的“SWI Prolog(多线程,64位,版本6.2.6)”。在Mac OS X 10.9上运行的SWI Prolog 7.1.16上,我只在调用
报警/0
谓词后以及在调用另一个顶级谓词的五秒钟后打印atom
ouch
。在调用
writeln/1
之后添加对
flush\u output/0
的调用并不能解决问题。这就是你观察到的行为吗?在哪个操作系统中?