2012-03-08 1 views
1

Моя попытка создать простой анимированный оболочки спиннера парень ...выход резьбы при печати/путы называется внутренней резьбой

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) > 

ответ

2

spinner_running потребности быть @spinner_running.

Это первый определяется как локальная переменная, а затем используется в потоке, который прекрасно, как блок будет иметь доступ к области действия она определена в. Однако start_ и stop_spinner методы определяют свои собственные рамки, так что, когда spinner_running является там используется новая локальная переменная.

Чтобы исправить это, его необходимо преобразовать в переменную экземпляра, предварительно указав ее @.

В ответ на ваш комментарий, я не думаю, что есть простой способ для потока определить это - потому что ошибка не в потоке.

+0

Да, это в основе того, что было не так, были некоторые ошибки в области охвата, которые скрывались от потока, который терпел молча ... любой способ обнаружить эти ошибки в потоке? – jondavidjohn

+0

Я не думаю, что нить не удалась - она ​​сделала именно то, что вы сказали ей! – Russell

+0

Хмм, я не могу придумать способ, чтобы поток обнаружил, что есть ошибка, но на плюсе сторона этой конкретной ошибки никогда не срабатывает случайно при тестировании, а затем не работает, что я вижу. – Russell