STDIN.getch как неблокирующее событие (возможно?)

Я пытаюсь мгновенно прочитать символ из командной строки без использования Enter. Код ruby ​​(ruby 1.9.3p374), который я использую, следующий:

require 'io/console'

ch = STDIN.getch
puts ch

до сих пор все работает нормально, но теперь я хочу поместить этот код в бесконечный цикл, выполняя некоторые другие действия, например

loop do
  puts "..doing stuff.."
  ch = STDIN.getch
  if ch == 'q'
    break
  end
end

но этот код всегда заставляет нажимать клавишу между каждой печатью. Я хочу, чтобы поведение было похоже на метод STDIN.read_nonblock, но без необходимости нажимать клавишу ввода после нажатия одного символа.

По сути, я хочу печатать «..делаю что-то..», пока не нажму определенную клавишу на клавиатуре, но я не хочу использовать ввод.

Любая помощь будет оценена. Спасибо


person Paulo Magalhães    schedule 17.04.2013    source источник


Ответы (1)


Вы всегда можете использовать встроенный curses библиотека для обработки вашего взаимодействия. Он очень мощный и используется для создания клавиатурных инструментов, таких как текстовые редакторы.

Альтернативой является использование select для опроса, доступен ли STDIN для чтения. Ваш терминал может находиться в состоянии линейной буферизации, поэтому вам необходимо настроить его до получения отдельных нажатий клавиш. Это то, с чем Curses может справиться за вас.

person tadman    schedule 18.04.2013
comment
Спасибо тадман. Я попытаюсь изучить библиотеку curses, чтобы проверить, смогу ли я найти решение моей проблемы. - person Paulo Magalhães; 18.04.2013
comment
Стоит отметить, что проблема с вводом может быть связана с буферизацией строк терминала. По умолчанию ничего не отправляется, пока не будет получена новая строка. Однако это можно изменить, но делать это с низкоуровневыми вызовами раздражает. Вам также придется восстановить терминал в состояние по умолчанию, иначе вы разрушите другие программы, зависящие от буферизации строк. Проклятия, хотя поначалу немного головокружительно, но могут многое сделать для вас и способны хорошо делать много вещей, связанных с управлением терминалом. - person tadman; 18.04.2013