2012-03-08 8 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

spinner_runningがあるとき、最初のローカル変数として定義し、そのブロックは、それがで定義されているのスコープにアクセスできるようになりますよう細かいスレッドで使用していました。しかしstart_stop_spinner方法は、独自のスコープを定義し、そうですここでは、新たに定義されたローカル変数が使用されます。

したがって、スレッドによって使用されるspinner_runningは決してtrueに設定されないため、実行時にスレッドはすぐに終了します。

これを修正するには、プレフィックスとして@をインスタンス変数にする必要があります。

あなたのコメントに答えて、私はスレッドにこのバグが見つからないという簡単な方法はないと思います。

+0

はい、これは何が間違っていたかの中心にあります。スレッドで暗黙的にエラーが発生していたスコープエラーがありました...これらのエラーをスレッドで検出する方法はありますか? – jondavidjohn

+0

私はスレッドが失敗したとは思わない - それはまさにあなたが言ったことをした! – Russell

+0

ええと、スレッドがエラーを検出する方法は考えられませんが、プラスの側面では、この特定のバグはテストでうまく動作せず、次に生産で失敗することはありません。 – Russell

関連する問題