SWI-Promog中的定时单个字符输入



我正在尝试在Swi-Prog中进行简单的定时菜单。用户应该能够点击一个键以选择一个选项,或者如果不按任何操作,它将在几秒钟后自动选择默认选项。我写了这篇文章以测试字符输入:

char_time:- catch(call_with_time_limit(5, get_single_char(X)), time_limit_exceeded, writeln('Too late!')),
            (ground(X) -> (char_code(Y, X), write('You picked '), writeln(Y)); true).

当我调用?- char_time.并输入角色时,它的行为如预期的。如果我不输入角色,它会打印出"为时已晚!"并尽其所能返回真实,但随后我收到错误消息:

ERROR: '$raw_read'/2: I/O error in read on stream user_input (Interrupted system call)
ERROR: I/O error in read on stream user_input (Interrupted system call)
ERROR: In:
ERROR:    [7] throw(error(io_error(read,user_input),context(...,'Interrupted system call')))

有什么办法解决这个问题?我想到用其他东西替换get_single_char/1,但是大多数其他类似的谓词都等待您按Enter,我希望菜单要使用单个密钥按下操作。

您可以使用SELECT与超时使用SELECT,而不是调用阻止读数,然后通过外部超时中断。问题在于,许多流库对于中断不是安全的,

您可能会在缓冲台上的内部数据中丢失数据,我已经以其他语言(例如Java.io(注意到了这一点。此选择的SWI-Prolog谓词是WAIT_FOR_INPUT/3,请参见:

等待在Listofstreams中的流中的一个流中输入并返回a
ReadyList中可用的输入的流列表。
wait_for_input( listofstreams,-dreadlist, 超时(
http://www.swi-prolog.org/pldoc/man?predicate=wait_for_input/3

免责声明:我不知道它是否真的适用于控制台输入。

最新更新