print / puts调用内部线程时的线程输出

时间:2012-03-08 19:15:30

标签: 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 "\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) > 

1 个答案:

答案 0 :(得分:2)

spinner_running需要@spinner_running

它首先定义为局部变量,然后在线程中使用,这很好,因为块可以访问它定义的范围。但是start_stop_ {{1}方法定义了它们自己的范围,因此当使用spinner时,它是一个新定义的局部变量。

因此线程使用的spinner_running永远不会设置为true - 因此线程在运行时会立即退出。

要解决此问题,需要将其添加到spinner_running作为实例变量。

在回答您的评论时,我认为线程没有一种简单的方法可以发现这一点 - 因为该错误不在线程中。