Ruby 在线程内调用print/puts时的线程输出
我试图创建一个简单的动画外壳旋转器家伙Ruby 在线程内调用print/puts时的线程输出,ruby,multithreading,stdout,Ruby,Multithreading,Stdout,我试图创建一个简单的动画外壳旋转器家伙 STDOUT.sync # spinner stuff spinner_running = false chars = ['|', '/', '-', '\\'] @spinner = Thread.new do loop do unless spinner_running Thread.stop print "\b" end print chars[0] sleep(1) print
STDOUT.sync
# spinner stuff
spinner_running = false
chars = ['|', '/', '-', '\\']
@spinner = Thread.new do
loop do
unless spinner_running
Thread.stop
print "\b"
end
print chars[0]
sleep(1)
print "\b"
chars.push chars.shift
end
end
def start_spinner
spinner_running = true
@spinner.wakeup
end
def stop_spinner
spinner_running = false
end
print ".......X"
start_spinner()
sleep(5)
stop_spinner()
只是尝试创建一个简单的旋转器,是的,我知道有一个宝石
为什么在代码中执行微调器时,我看不到它的进度
当前输出:ruby spinner.rb
.......X< new prompt (no new line) >
…X
spinner\u正在运行
需要@spinner\u正在运行
它首先定义为一个局部变量,然后在线程中使用,这很好,因为块可以访问它定义的范围。但是,start\u
和stop\u
spinner
方法定义了它们自己的范围,因此在使用spinner\u running
时,它是一个新定义的局部变量
因此线程使用的spinner\u running
从未设置为true-因此线程在运行时会立即退出
要修复它,需要通过在它前面加上@
将它变成一个实例变量
在回答您的评论时,我认为线程没有一个简单的方法来发现这一点,因为bug不在线程中。是的,这是问题的核心,有一些范围错误被隐藏在线程的无声失败中。。。有什么方法可以检测线程上的这些错误吗?我不认为线程失败了-它完全按照你的要求做了!嗯,我想不出线程检测错误的方法-但从好的方面来看,我可以看到,这个特定的错误永远不会在测试中意外出现,然后在生产中失败。顺便说一句,我不是想用简单的解释来光顾你,我只是觉得这对以后可能会问这个问题的其他人会有用。