我需要用红宝石脚本来表示程序。 这个程序定期打印一个JSON,在主脚本中我需要拦截它并进行计算。 感谢
这样的事情:
MAIN:
Spawn a process
//This generates stdout periodically
//End call
Intercept its stdout
//REST of the code
怎么样? 我需要使用eventmachine吗?有些?
我用这段代码澄清
timer = EventMachine.add_periodic_timer POLLING_INTERVAL do
if memcached_is_running
ld 'reading from device'
begin
IO.popen("HostlinkPollerLight -p #{SERIAL_PORT} -v #{SERIAL_BAUDRATE} -r #{MODEL_CONFIG} 2> /dev/null") do |payload|
$_data = JSON.parse payload.readlines[0]
end
if $data['success']
memcache.set( MEMCACHE_DATA_KEY, _to_json( $data[ 'result' ], _mapping ))
timer.interval = POLLING_INTERVAL
else
log_this " read fault: error_code #{$data['fault']}"
timer.interval = FAULT_INTERVAL
end
rescue Errno::ENOENT
log_this 'Unable to read output'
rescue JSON::ParserError
log_this 'Malformed data'
end
else
timer.interval = FAULT_INTERVAL
system("on_red_led.sh 2")
end
log_this "elapsed time: #{Time.now.to_f - delta}"
ld "## end read: #{counter}"
counter += 1
end
我只需要用popen打开程序一次,并在每次打印stdout时获取stdout。
答案 0 :(得分:0)
我这样做的方法是,我创建一个类,它创建一个带有无限循环的新线程,它改变了对象的实例变量。然后我可以通过其getter访问这些变量。例如:
class Stopwatch
def initialize
@seconds = 0
end
def start
@thread = Thread.new do
loop {
sleep(1)
@seconds += 1
}
end
end
def seconds
@seconds
end
def stop
@thread.kill
end
def reset
@seconds = 0
end
end
stoper = Stopwatch.new
stoper.start
sleep(5)
stoper.seconds #=> 5