Ruby - 如何在终端中创建多个进度条

时间:2018-06-18 13:07:44

标签: ruby multithreading concurrency

我正在尝试在Ruby中实现一个线程竞赛,它应该显示终端中的每个线程进度(实时类型)。我被阻挡了我需要移动到前一个终端线的位置。

我使用此解决方案atm:

bar, bar2 = '', ''
  50.times do |i|
  bar << '='
  bar2 << '**'
  puts  "#{bar} - #{i+1}0%"
  print "#{bar2} - #{i+1}0%"
  print "\033[F\r"
  sleep 0.3
end

它仍然仅适用于2个条形图,我不知道如何使用更多的线程进行缩放。

1 个答案:

答案 0 :(得分:2)

应该广泛使用escape sequences for cursor movement

BARS_COUNT = 3 
SYMBOLS = %w|= ** ℹℹℹ|
BARS = ['', '', ''] 

BARS_COUNT.times { puts } # prepare the space

20.times do |i| 
  print "\033[#{BARS_COUNT}A"
  BARS_COUNT.times do |pos|
    BARS[pos] << SYMBOLS[pos]
    puts "\033[#{i * SYMBOLS[pos].length}C#{SYMBOLS[pos]}"
  end 
  sleep 0.1 
end

对于更复杂的定位,请使用我链接的参考文献中描述的\033[<L>;<C>f