如何解决程序终止后,Ruby获取输入到控制台命令行
| 我试图用两个额外的线程来建立一个简单的ruby程序。 一个线程是检查串行端口中的数据,并在发现任何内容时填充变量。 第二个线程是对\'gets \'的调用,返回时将停止程序。 主线程只是将第一个附加线程存储的值输出到控制台(该程序是基于控制台的数据记录器)。 我的问题是第二个线程启动正常,如您在输出中的“按Enter ...”注释中所见。D:\\Documents and Settings\\JMEDDING\\My Documents\\Ruby scripts>c-scope.rb -t
\"Press \'Enter\' to end process\"
511,511,485 | | | | | + | | | | | 536
511,485 | | | | | + | | | | | 536
512,485 | | | | | XO | | | | | 536
512,512,485 | | | | | |+ | | | | | 536
但是从中返回的任何数据
输入=获取
不会进入程序。相反,在使用ctrl-c杀死程序之后,可以在控制台命令行上看到它。
我在Windows的ruby控制台中运行它。这以前曾经可以正常工作,但是我在某一时刻重新安排了代码,现在它不配合了。我已经在下面复制了整个程序。我想这很简单,但是我完全陷入了困境,因此感谢您的关注。
乔恩
require \'serialport\'
TEST = true if ARGV[0] == \'--test\' || ARGV[0] == \'-t\'
# Edit the two settings below
port = \"COM6\" #\"/dev/tty.usbserial-A600b1Q6\"
baud = 9600
begin
if RUBY_PLATFORM =~ /win32/ || RUBY_PLATFORM == \"i386-mingw32\"
require \'Win32/Console/ANSI\'
end
rescue LoadError
raise \"You must \'gem install win32console\' to use color on Windows\"
end
if TEST
sp = nil
else
sp = SerialPort.new port,baud,8,1,SerialPort::NONE
end
symbols = [\"X\",\"O\",\"@\",\"#\"]
vals = [] #max four values to plot
input = nil
len = 50
max = 0
min = 1200
if TEST
vals = [511,511]
end
def colorize(text,color_code)
\"\\033[1;#{color_code}m#{text}\\033[0m\"
end
def red(text); colorize(text,\"31\"); end
def green(text); colorize(text,\"32\"); end
def blue(text); colorize(text,\"34\"); end
def color_the_symbols(text,symbols)
color = 31 # \"+\" = red,then green,yellow,blue,pink
chars = [\"+\"] + symbols
chars.each_with_index do |s,i|
text.gsub!(s,colorize(s,\"#{color + i}\"))
end
text
end
def base_string (len,min,max,vals,symbols)
s = \"\"
(0..len).each {|i| s += i%5 == 0 ? \"|\" : \" \"}
vals.each_with_index do |val,i|
pos = len * (val - min)/ (max - min)
char = symbols.include?(s[pos] ) ? \"+\" : symbols[i]
s[pos] = char
end
color_the_symbols s,symbols
end
#listen to STDIN for stop signal
Thread.new do
p \"Press \'Enter\' to end process\"
input = gets #pressing enter will stop the other loops
end
sleep(1)
#listening thread
Thread.new do
while !input
if TEST
(0...vals.count).each {|i| vals[i] += rand(3) - 1}
else
c = \"\"
word = \"\"
until c == \"\\n\"
c = sp.getc
word << c.to_s
#p \"Flushing buffer #{c}\"
end
#p word.chomp
vals[0] = Integer(word.chomp)
end
sleep(0.5)
end
end
while !input #will be true until enter key is pressed
while vals.count == 0
#wait for firs data to show up
sleep (0.1)
end
for i in (0...vals.count) do
#validate min and max
max = (vals[i] * 1.05).to_i if vals[i] > max
min = (vals[i] * 0.95).to_i if vals[i] < min
end
output = base_string(len,symbols)
output = \" #{red(min.to_s)} \" + output + \" #{red(max.to_s)}\"
color = 32
vals.each_with_index do |val,i|
output = \" #{colorize(\"%4d,\" % val,\"#{color + i}\")}\" + output
end
puts output
sleep(1)
end
解决方法
我认为某个地方有错误,但是该通知被线程行为掩盖了。我进行了一些无关的更改,并且在进行一些调试之后,它又开始工作了。抱歉,我不能更具体。
, 你需要
thread = Thread.new
# blah
end
thread.join
如果您希望该线程在程序完成之前完成其工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。