2013-12-04 2 views
0

Мне нужно развернуть программу в рубиновом скрипте. Эта программа периодически печатает JSON, и в главном скрипте мне нужно перехватить это и сделать расчет. БлагодаряSpawn process thats loops и get stdout постоянно в ruby ​​

Что-то вроде этого:

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 

мне нужно spwan только один раз, когда программа открыта с POPEN и получить стандартный вывод каждый раз, когда его печать стандартный вывод.

+0

и ваш вопрос? – fotanus

ответ

0

Как я это делаю, я создаю класс, который создает новый поток с бесконечным циклом, который изменяет переменную экземпляра объекта. Затем я могу получить доступ к этим переменным через свои геттеры. Пример:

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 
Смежные вопросы