2015-12-05 17 views
0

我在C prog中使用ncurses,我想使用getch()来捕获箭头键和转义键。删除getch()函数的延迟

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

您是否认为延迟可能会被删除或设置为零?

人或IBM文档说这不是有益的尝试赶上与残培逃跑的时候,你在同一时间使用键盘的,但我想获得它...

对不起我的英文不好,并感谢你你的答案:)

回答

3

你必须在看到箭头键和功能键,或者键入命令时立即获得转义键。即使你真的真的很想立即看到逃跑并看到方向键,你也不能。这是因为箭头键发送的第一件东西是一个转义字符,所以如果wgetch看到一个转义字符,它需要检查下一个字符,然后才能断定该字符是由转义键生成的。

curses接口是为来自终端的数据通过可能很慢的网络连接传输到计算机的可能性而设计的。有可能的是,作为功能键序列的一部分的转义字符在网络分组的末尾被发送,而下一个字符是下一个分组的一部分,并且因此在这两个分组之间可能存在延迟字符。但即使没有网络,键盘也不是超高速设备,并且多字符序列中的字符以明显的(到计算机)延迟的方式发送。因此,没有一点时间,wgetch将不可能识别功能和方向键。

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

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

+0

非常感谢您的全面回答,我更了解在以下级别发生的事情总是更好地了解所有内容! :) –