SWI-Prolog定时菜单开发:单字符输入超时处理问题咨询
看起来你已经迈出了实现定时菜单的关键一步!你的测试代码思路很清晰,用call_with_time_limit/3来处理超时逻辑,结合get_single_char/1捕获按键输入,这个方向完全没问题。先把你的代码贴出来方便大家参考:
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.时,5秒内输入字符能正确输出对应结果,超时也会打印提示,这部分表现符合预期。结合你提到的“后续存在相关问题待解决”,我猜你可能在考虑以下几个方向的优化,这里给你一些实用的改进建议:
1. 完善默认选项逻辑
目前超时只是打印提示,没有自动选择默认项,你可以直接在超时分支里绑定默认字符,让流程更完整:
char_time_with_default(DefaultChar):- catch(call_with_time_limit(5, get_single_char(X)), time_limit_exceeded, (X = DefaultChar, writeln('Time out! Using default option.'))), char_code(Y, X), write('Selected: '), writeln(Y).
调用时可以指定默认值,比如?- char_time_with_default(0'1).就会默认选择字符'1'。
2. 过滤无效输入
如果是菜单场景,肯定只允许用户选择指定选项(比如数字1-3),可以加个输入验证循环:
valid_option(X) :- member(X, [0'1, 0'2, 0'3]). char_time_menu:- writeln('Menu:'), writeln('1. Option 1'), writeln('2. Option 2'), writeln('3. Option 3'), writeln('You have 5 seconds to choose...'), catch( (repeat, get_single_char(X), valid_option(X)), time_limit_exceeded, (X = 0'1, writeln('Time out! Defaulting to Option 1.')) ), char_code(Y, X), write('You selected Option '), writeln(Y).
这里用repeat循环,直到用户输入有效字符或者超时触发默认选择。
3. 处理输入缓冲残留
有时候之前的输入会留在缓冲区里,导致下次调用get_single_char/1时直接读取旧输入,你可以加个清空缓冲的步骤:
clear_input_buffer :- repeat, get_single_char(C), C = -1. % 读到输入结束标志为止 char_time:- clear_input_buffer, 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).
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

