14

時間がかかる仕事をするRubyスクリプトがあります。これはコマンドラインのみであり、スクリプトがまだ実行中であり、停止していないことを示したいと思います。昔はいわゆる「回転カーソル」が好きで、WindowsのRubyで再現することができました。

質問:これは他のOSでも機能しますか?そうでない場合、これを達成するためのOSに依存しない方法はありますか?

IRBソリューションはご遠慮ください。

10.times {
  print "/"
  sleep(0.1)
  print "\b"
  print "-"
  sleep(0.1)
  print "\b"
  print "\\"
  sleep(0.1)
  print "\b"
  print "|"
  sleep(0.1)
  print "\b"
}
4

3 に答える 3

35

はい、これはWindows、OS X、およびLinuxで機能します。Niklasの提案を改善すると、次のようにこれをより一般的にすることができます。

def show_wait_cursor(seconds,fps=10)
  chars = %w[| / - \\]
  delay = 1.0/fps
  (seconds*fps).round.times{ |i|
    print chars[i % chars.length]
    sleep delay
    print "\b"
  }
end

show_wait_cursor(3)

プロセスにかかる時間がわからない場合は、別のスレッドでこれを行うことができます。

def show_wait_spinner(fps=10)
  chars = %w[| / - \\]
  delay = 1.0/fps
  iter = 0
  spinner = Thread.new do
    while iter do  # Keep spinning until told otherwise
      print chars[(iter+=1) % chars.length]
      sleep delay
      print "\b"
    end
  end
  yield.tap{       # After yielding to the block, save the return value
    iter = false   # Tell the thread to exit, cleaning up after itself…
    spinner.join   # …and wait for it to do so.
  }                # Use the block's return value as the method's
end

print "Doing something tricky..."
show_wait_spinner{
  sleep rand(4)+2 # Simulate a task taking an unknown amount of time
}
puts "Done!"

これは出力します:

Doing something tricky...|
Doing something tricky.../
Doing something tricky...-
Doing something tricky...\ 
(et cetera)
Doing something tricky...done!
于 2012-04-21T21:52:57.503 に答える
6
# First define your chars
pinwheel = %w{| / - \\}

# Rotate and print as often as needed to "spin"
def spin_it
  print "\b" + pinwheel.rotate!.first
end

ピーターからの編集:ここで作業バージョン

def spin_it(times)
  pinwheel = %w{| / - \\}
  times.times do
    print "\b" + pinwheel.rotate!.first
    sleep(0.1)
  end
end

spin_it 10
于 2012-06-01T15:24:49.460 に答える
3

ブロックを生成しながらスピナーを表示するgemspin_to_winを作成しました。例えば:

SpinToWin.with_spinner('Zzzz') do |spinner| 
  spinner.banner('sleepy')
  sleep 1 
end
Zzzz \ [sleepy]

また、保留中の作業と完了した作業を追跡することもできます。

SpinToWin.with_spinner('Zzzz') do |spinner|
    spinner.increment_todo!(3)

    spinner.banner('snore')
    sleep 1
    spinner.increment_done!

    spinner.banner('dream')
    sleep 1
    spinner.increment_done!

    spinner.banner('wake up!')
    sleep 1
    spinner.increment_done!
end
Zzzz \ 3 of 3 [wake up!]
于 2016-03-06T04:01:18.017 に答える