2014-12-06 118 views
2

我正在寫一個mpd客戶端使用ruby-mpd庫。它有回調驅動的事件監聽器,但我不知道如何等待回調被executed.o紅寶石,等待回調

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 

如果我通過線IRB connected跑這條線mpd.connect後會進行打印,但如果我運行作爲一個腳本,它會在調用連接後立即退出(在回調被調用之前?) 在文件末尾添加sleep調用也無濟於事。

如何讓此腳本永不退出並等待來自用戶的終止信號?

好吧,我看着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

你嘗試'而真實的;結束? – 2014-12-06 22:17:34

+0

'while true;結束「工作,我期望阻止和防止其他線程或過程運行。 – everett1992 2014-12-06 22:45:47

+0

它浪費CPU時間,但你可以在那裏發出一個小睡眠聲明來幫助解決這個問題。它不會阻塞其他線程,這是擁有操作系統的主要因素之一。 – 2014-12-06 23:53:56

回答

1

你可以包裹在EventMachine的塊中的通話MPD,這將處理while true; end循環,不浪費CPU週期。你還可以獲得所有的事件機器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