GTK+ のプログレスバーを使ってみる

require './progress_bar'

ProgressBar.set do |bar|
  for i in 0..10
    bar.fraction(i / 10.0)
    sleep(0.3)
  end
end

続けてもう一度プログレスバーを表示させると、何故だか「b.rb: Fatal IO error 0 (成功です) on X server :0.」というエラーが出る。大成功だと思っていたけれど、この不具合を直さないときちんと公表できないなあ。もう一度プログレスバーを表示させようとしなければ問題なさそうなのだが。
 
progress_bar.rb

require 'gtk2'

class ProgressBar
  def initialize
    w = Gtk::Window.new
    w.set_size_request(300, 50)
    w.border_width = 10
    w.title = "Progress"
    
    bar = Gtk::ProgressBar.new
    w.add(bar)
    
    reader, @writer = IO.pipe
    
    @f = fork do
      @writer.close
      Thread.new(bar, reader) do |bar, r|
        loop { bar.set_fraction(r.gets.to_f) }
      end
      w.signal_connect("destroy") {Gtk.main_quit}
      w.show_all
      Gtk.main
    end
  end
  
  def fraction(r)
    @writer.puts(r)
  end
  
  def delete
    sleep(1)
    Process.kill("KILL", @f)
    @writer.close
    Process.wait
  end
  
  def self.set
    bar = ProgressBar.new
    yield(bar)
    bar.delete
  end
end

 
※参考
Ruby-GNOME2 Project Website - Ruby-GNOME2 Project Website

追記

結局こんな感じに落ち着きました。
GTK+ でプログレスバーを簡単に使う(Ruby) - Camera Obscura