2012-01-29 45 views
2

我正在與一個帶有LCD的RS232鍵盤進行通信。在每次按鍵時,我都會將按下的按鍵寫入LCD以向用戶提供反饋。在塊內增加timeout.rb定時器

如果在10秒內沒有按鍵,我想放棄等待輸入。

我已經寫了一些代碼,如果用戶沒有在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

我發現實現用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?