【问题标题】:How to to set an alarm on SWI-Prolog?如何在 SWI-Prolog 上设置闹钟?
【发布时间】:2014-06-13 19:15:29
【问题描述】:

我正在尝试制作 5000 毫秒后在屏幕上打印的东西。 我正在使用此代码,5 秒后 Prolog 关闭。 我有这段代码要编译:

:- use_module(library(time)).

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

【问题讨论】:

  • 您使用的是哪个 SWI-Prolog 版本?
  • 我使用的是6.6.6版本
  • @SergeyDymchenko 您使用哪个版本的 Prolog?谢谢
  • @PedroSilva “SWI-Prolog(多线程,64 位,版本 6.2.6)”在 Linux 上。
  • 在 Mac OS X 10.9 上运行的 SWI-Prolog 7.1.16 上,我只在调用 alarm/0 谓词后打印原子 ouch,如果我在顶层。在调用writeln/1 之后添加对flush_output/0 的调用并不能解决问题。这是您观察到的行为吗?在哪个操作系统中?

标签: timer window prolog alarm swi-prolog


【解决方案1】:

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

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

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

?- outch

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

sleep :- sleep(1000), sleep.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多