删除getch()函数的延迟

时间:2015-12-05 05:00:02

标签: c ncurses

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

我使用newterm,raw模式,noecho模式和键盘设置为TRUE以正确使用getch。 我可以很容易地得到箭头的关键代码或者每个键,但是当我按下escape时,我知道getch设置一个约1秒的计时器来检查是否没有按下任何其他键。

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

Man或IBM doc说当你在同一时间使用键盘时尝试用getch捕获逃生没有用,但我想得到它...

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

1 个答案:

答案 0 :(得分:3)

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

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

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

有关详细信息,请参阅man curs_variablesman curs_threads。 (在某些发行版中,您可能需要使用不同的man参数,例如man curses_variablesman 3ncurses threads。)