Печать ASCII вращающегося "курсора" в консоли
У меня есть Ruby script, который выполняет некоторые длительные задания. Это только командная строка, и я хотел бы показать, что script все еще работает и не останавливается. Раньше мне нравился так называемый "вращающийся курсор", и мне удалось воспроизвести его в Ruby под Windows.
Вопрос: работает ли это в других ОС? Если нет, существует ли независимый от ОС способ выполнить это?
Нет решений 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"
}
Ответы
Ответ 1
Да, это работает на Windows, OS X и Linux. Улучшая предложение Никласа, вы можете сделать это более общим, например:
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 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!
Ответ 2
# First define your chars
pinwheel = %w{| / - \\}
# Rotate and print as often as needed to "spin"
def spin_it
print "\b" + pinwheel.rotate!.first
end
ИЗМЕНИТЬ из peter: здесь рабочая версия
def spin_it(times)
pinwheel = %w{| / - \\}
times.times do
print "\b" + pinwheel.rotate!.first
sleep(0.1)
end
end
spin_it 10
Ответ 3
Я написал gem spin_to_win, который отображает spinner, в то время как дает блок. Например:
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!]