2014-12-06 150 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