Ruby получает ввод, отправляется в командную строку консоли после завершения программы - PullRequest
0 голосов
/ 14 июня 2011

Я пытаюсь настроить простую программу ruby ​​с двумя дополнительными потоками.

  • Один поток должен проверить последовательный порт на наличие данных и заполнить переменную, если что-то будет найдено.

  • Вторым потоком является вызов get, который при возврате остановит программу.

  • Основной поток просто выводит значения, сохраненные первым дополнительным потоком, в консоль (программа представляет собой консольный регистратор данных).

Моя проблема в том, что второй поток запускается нормально, как вы можете видеть из заметки «Нажмите Enter ...» в выводе.

D:\Documents and Settings\JMEDDING\My Documents\Ruby scripts>c-scope.rb -t
"Press 'Enter' to end process"
   511,   511,             485 |    |    |    |    |    +    |    |    |    |    | 536
   511,   511,             485 |    |    |    |    |    +    |    |    |    |    | 536
   512,   511,             485 |    |    |    |    |    XO   |    |    |    |    | 536
   512,   512,             485 |    |    |    |    |    |+   |    |    |    |    | 536

но все данные возвращаются с

вход = получает

не входит в программу. Вместо этого его можно увидеть в командной строке консоли после завершения работы программы с помощью ctrl-c.

Я запускаю это в консоли ruby ​​на windows. Раньше это работало должным образом, но я однажды перестроил код, и теперь он не взаимодействует. Я скопировал всю программу ниже. Я думаю, это очень просто, но я застрял, так что спасибо, что посмотрели.

Jon

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, min, max, vals, 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

Ответы [ 2 ]

0 голосов
/ 15 июня 2011

Вам нужно иметь

thread = Thread.new
  # blah
end

thread.join

Если вы хотите, чтобы этот поток завершил свою работу до завершения программы.

0 голосов
/ 14 июня 2011

Я думаю, что где-то произошла ошибка, но уведомление было скрыто из-за поведения потоков. Я сделал некоторые несвязанные изменения и после некоторой отладки он снова начал работать. Извините, я не могу быть более конкретным.

...