2014-12-06 4 views
2

ruby-mpd 라이브러리를 사용하여 mpd 클라이언트를 작성하고 있습니다. 나는 그것을 실행하는 경우 콜백 구동 이벤트 리스너를 가지고 있지만 나는 mpd.connect 후 인쇄됩니다 IRB connected에서 선으로이 줄을 실행하면 콜백이Ruby, 콜백 대기

require 'ruby-mpd' 

puts "started new thread" 
mpd = MPD.new('localhost', '6600', callbacks: true) 

# MPD#connect and MPD#disconnect fire the `:connection` event. 
mpd.on(:connection) do |connection| 
    if connection 
    puts 'connected...' 
    else 
    puts 'disconnected' 
    end 
end 

mpd.connect 

을 executed.o 될 때까지 기다려야하는 방법을 알고하지 않습니다하지만, (callback이 호출되기 전에?)sleep 호출을 파일 끝에 추가하면 도움이되지 않습니다.

이 스크립트를 종료하지 않고 어떻게 사용자의 kill 신호를 기다릴 수 있습니까?

좋아, 나는 ruby-mpd가 콜백을 어떻게 구현하는지 보았다. 상태 객체를 업데이트하는 블록을 루프하는 스레드를 생성합니다. 객체가 변경되면 이벤트가 발생합니다.

나는 초기 예제가 connection 속성의 변경을 놓친 적이 없어서 결코 해고되지 않았을 것으로 생각합니다.

require 'ruby-mpd' 

mpd = MPD.new('localhost', '6600', callbacks: true) 

mpd.on(:connection) do 
    puts 'connected...' 
end 

mpd.on(:state) do |state| 
    puts state 
end 

mpd.on(:time) do |elapsed_time, total| 
    puts "#{elapsed_time}/#{total}" 
end 

mpd.connect 

while true; end 
+0

당신이'시도해 봤어 진정한 동안; 끝 '? –

+0

'true; end'가 작동하면 다른 스레드 나 procs가 실행되는 것을 차단하고 차단할 것으로 예상됩니다. – everett1992

+0

그것은 CPU 시간을 낭비하지만, 거기에 작은 절전 명령문을 던져서 도움을 줄 수 있습니다. 운영 체제가있는 주요 요점 중 하나 인 다른 스레드를 차단하지 않습니다. –

답변

1

당신은 eventmachine 블록의 MPD 호출을 포장 수,이 CPU 사이클을 낭비 while true; end 루프를 처리하지 않습니다. 또한 이벤트 머신 I/O, 지연 및 타이머 로직을 무료로 가져올 수 있습니까?

100 % 검증되지 않은 코드를하지만, 이런 식으로 뭔가가 것 :

require 'ruby-mpd' 

EventMachine.run do 

    mpd = MPD.new('localhost', '6600', callbacks: true) 

    mpd.on(:connection) do 
    puts 'connected...' 
    end 

    mpd.on(:state) do |state| 
    puts state 
    end 

    mpd.on(:time) do |elapsed_time, total| 
    puts "#{elapsed_time}/#{total}" 
    end 

    mpd.connect 

end 
관련 문제