Увеличьте таймер timeout.rb внутри блока - PullRequest
2 голосов
/ 29 января 2012

Я общаюсь с клавиатурой RS232 с ЖК-дисплеем. При каждом нажатии клавиши я пишу клавишу, которая была нажата на ЖК-дисплее, чтобы обеспечить обратную связь с пользователем.

Если в течение 10 секунд не будет нажата ни одна клавиша, я бы хотел отказаться от ожидания ввода.

Я написал некоторый код, который прервется по таймауту, если пользователь не введет многосимвольное значение в течение 10 секунд. Я бы предпочел дать ему еще 10 секунд для завершения ввода после каждого нажатия клавиши. 1005 *

Возможно ли это с помощью timeout.rb?

require 'rubygems'
require 'serialport'
require 'timeout'

sp = SerialPort.new('/dev/tty.usbserial', 9600, 8, 1, SerialPort::NONE)

sp.write("Input:")

begin
   timeout(10) do
      input = ""
      sp.each_byte do |byte|
         #call to increase timeout.rb timer would go here
         input << byte.chr
         sp.write("Input:" + input)
      end
   end
rescue Timeout::Error
   puts "Timed out!"
   exit
end

puts input

1 Ответ

1 голос
/ 29 января 2012

Я нашел альтернативный способ достижения желаемого эффекта, используя Threads вместо timeout.rb, но мне было бы интересно изучить альтернативные методы.

require 'rubygems'
require 'serialport'

sp = SerialPort.new('/dev/tty.usbserial', 9600, 8, 1, SerialPort::NONE)

sp.write("Input:")

input = ""
timer = Time.now + 10

t = Thread.new do
  sp.each_byte do |byte|
    timer = Time.now + 10
    input << byte.chr
    sp.write("Input:" + input)
  end
end

t.kill unless Time.now < timer while t.alive?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...