【发布时间】:2018-03-12 09:13:19
【问题描述】:
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。但是线程不会更改我点击的 first Enter 上的flag 的值。不过,第二次按 Enter 会将标志更改为 1。该线程正常工作,在进一步 Enter 命中时切换flag 的值。为什么会这样?我做错了什么?
问题似乎只出在getch
当我使用gets 代替getch 时,问题就消失了。但我不能使用gets,因为我希望用户点击一个键而不需要在键后按 Enter 来输入。
例如,flag 不应该在用户输入 a 而不是 Enter 时改变,所以我使用getch 来确保在单次键盘敲击后给出输入.
here 描述了一个类似的问题,但它不是重复的。
编辑 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]
【问题讨论】:
标签: ruby multithreading stdin getch