消除 getch() 函数的延迟

Lir*_*rre 1 c ncurses

我在 C prog 中使用 ncurses,我想使用 getch() 来捕捉箭头键和转义键。

我使用 newterm、原始模式、noecho 模式和设置为 TRUE 的键盘来正确使用 getch。我可以轻松获得箭头的键码或每个键,但是当我按下 Esc 键时,我知道 getch 设置了一个约 1 秒的计时器来检查是否没有按下任何其他键。

您认为延迟可以删除或设置为零吗?

人或 IBM 文档说,当您同时使用键盘时,尝试使用 getch 进行转义是没有用的,但我想得到它...

抱歉我的英语不好,谢谢你的回答:)

ric*_*ici 5

您必须在查看箭头键和功能键之间进行选择,或者在键入时立即获得转义键。即使您真的真的很想立即看到转义并看到箭头键,您也不能。这是因为箭头键发送的第一件事是转义字符,因此如果 wgetch 看到转义字符,它需要检查下一个字符,然后才能得出该字符是由转义键生成的结论。

curses 接口设计用于将来自终端的数据通过可能较慢的网络连接传输到计算机的可能性。作为功​​能键序列一部分的转义字符可能会在网络数据包的末尾发送,而下一个字符是下一个数据包的一部分,因此,两者之间可能存在延迟人物。即使没有网络,键盘也不是超高速设备,多字符序列中的字符在发送时会有明显的(到计算机)延迟。因此,如果不花一些时间,就无法wgetch识别功能键和箭头键。

如果您准备冒有时将箭头键转换为转义序列的风险,则可以减少转义延迟。默认情况下,它设置为 1000 毫秒(1 秒),但您可以通过更改全局变量的值来更改它ESCDELAY。如果您的 ncurses 库是在启用了适当的线程功能的情况下编译的,您还可以使用set_escdelay特定于ncurses. 在这两种情况下,该值都是一个整数,表示要延迟的毫秒数。

查看man curs_variablesman curs_threads了解更多详情。(在某些发行版上,您可能需要使用不同的man参数,例如man curses_variablesman 3ncurses threads。)