サイログ。

~雑多な記事置き場~

Rubyでスレッドプログラミングその3

というわけで、3回目。
今回はマルチスレッディングで。
3つのスプライトを生成して時計を3つ表示するという無駄な(爆)プログラムです。

というわけで、↓へ続く。

#スレッドを使った時計サンプル
#2008.03.27 Cyross Makoto
require 'Miyako/miyako'
require 'Miyako/idaten_miyako'

include Miyako

@font = Font.sans_serif
@font.size = 32

#時間を描画するスレッドを作成
@proc = Proc.new{|font, y|
  Thread.current[:finish] = false
  base = Sprite.new(:size=>[400,40], :type=>:ac)
  base.left.top{|body| y}.show
  until Thread.current[:finish] do
    begin
      base.fill([0,0,0,0])
      font.draw_text(base, 
                     Time.now.strftime("ただいまの時刻 %H:%M:%S"),
                     0, 0)
    rescue
      Thread.exit
    ensure
      Thread.pass
    end
  end
  base.hide
}

list = []
3.times{|n|
  list << Thread.new(@font, 40*n, &@proc)
}

#ここでは、Screen.upを呼び出した後に処理を加える
#必要があったので、#Miyako.main_loopを使わずloopを使用。
loop do
  Input.update
  break if Input.quit_or_escape?
  Screen.update
  Thread.pass # 生きているスレッドに実行件を渡す
end

list.each{|th|
  th[:finish] = true # 終了フラグを渡す
  th.join
}

これで実行エイヤッ

・・・。

うーん、3つ同時に時計が動いている(時間がちゃんと進んでいる)けど
やっぱりちらつく。どうやったらええんやろか。添削求ム。