require 'rubygems'
require 'mechanize'
require 'io/console'
flag = 0
t2 =Thread.new do
puts flag
loop do
temp = STDIN.getch
if temp=="\n"
flag = (flag+1)%2
puts flag
end
end
end
# => Some foreground code
t2.join
Когда я запускаю код, я получаю значение flag
, напечатанное 0
, как и должно быть. Но поток не меняет значение flag
при первом нажатии Enter. Нажатие Enter во второй раз изменяет флаг на 1
. Поток работает нормально, переключая значение flag
при дальнейших нажатиях Enter. Почему это происходит? Что я сделал не так?
Похоже, проблема только с getch
, так как когда я использую gets
вместо getch
, проблема исчезает. Но я не могу использовать gets
, потому что хочу, чтобы пользователь нажимал одну клавишу без необходимости нажимать Enter после клавиши для ввода. Например, flag
не должно изменяться, когда пользователь вводит a вместо Enter, поэтому я использовал getch
, чтобы убедиться, что ввод осуществляется после одного нажатия на клавиатуру.
Аналогичная проблема была описана здесь, но это не дубликат.
Редактировать 1: Проблема, похоже, связана с getch
, а не с проверкой того, что делать когда-либо.
flag = 0
t2 =Thread.new do
puts flag
loop do
temp = STDIN.getch
flag = (flag+1)%2
puts flag
end
end
t2.join
Даже после удаления оператора if первый Enter игнорируется, несмотря ни на что, но другие символы, кажется, реагируют на первый раз. Проблема возникает только тогда, когда я нажимаю Enter. Первое нажатие Enter не засчитывается.
ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]