我尝试创建一个简单的动画外壳微调器......
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) >
答案 0 :(得分:2)
spinner_running
需要@spinner_running
。
它首先定义为局部变量,然后在线程中使用,这很好,因为块可以访问它定义的范围。但是start_
和stop_
{{1}方法定义了它们自己的范围,因此当使用spinner
时,它是一个新定义的局部变量。
因此线程使用的spinner_running
永远不会设置为true - 因此线程在运行时会立即退出。
要解决此问题,需要将其添加到spinner_running
作为实例变量。
在回答您的评论时,我认为线程没有一种简单的方法可以发现这一点 - 因为该错误不在线程中。