如何在 SWI-Prolog 上设置闹钟?

Posted

技术标签:

【中文标题】如何在 SWI-Prolog 上设置闹钟?【英文标题】:How to to set an alarm on 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 的调用并不能解决问题。这是您观察到的行为吗?在哪个操作系统中? 【参考方案1】:

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

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

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

?- outch

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

sleep :- sleep(1000), sleep.

【讨论】:

以上是关于如何在 SWI-Prolog 上设置闹钟?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 GNU-Emacs 在 SWI-Prolog 上编辑“Prolog 程序名称”(尝试设置劣质 Prolog 进程)

如何在 iOS 中设置闹钟?

如何设置在耳机里听的闹钟?

如何检查是不是设置了闹钟

如何以编程方式设置 iPhone 闹钟?

win10 如何卸载系统自带闹钟?