2012-01-29 7 views
2

私はLCDを備えたRS232キーパッドと通信しています。キーを押すたびに、LCDに押されたキーを書き込んでユーザーにフィードバックします。キーが10秒以内に押さないとブロック内のtimeout.rbタイマーを増やす

私は入力待ち放棄したいと思います。

ユーザーが10秒以内に複数文字の値を入力しなかった場合、タイムアウトするコードを書いていますが、キーを押すたびに入力を完了するまでに10秒を要します。

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

私の代わりにtimeout.rbThreadsを使用して、所望の効果を達成するための別の方法を発見したが、別の方法を学ぶために興味があります。

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? 
関連する問題