我正在使用ruby-mpd库编写mpd客户端。它有回调驱动的事件监听器,但我不知道如何等待回执被执行.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
之后打印,但是如果我将其作为脚本运行,它会在调用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 :(得分: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