サイログ。

~雑多な記事置き場~

はじめてのスレッドプログラミング−時計プログラム

よくよく考えてみたら、当方、マルチスレッドを使ったプログラムを書いたことがなかった。
たぶん、資料を読んでみて、「なんとなく難しそう」と思って意図的に避けていたわけだが(要するに食わず嫌い)。
しかも、なぜかマルチスレッドを扱う仕事が無かった(もしかしたら、気づいてなかっただけかもしれない)。

とはいえ、Miyakoの開発を進めていって、「マルチスレッド」を机上の知識としてだけではなく、実装して知識を体感する必要があると思い立ちました。

というわけで、スレッドを使った時計プログラムを作ってみました。

ちなみに、使用しているMiyakoは1.5pre4。
http://www.twin.ne.jp/~cyross/Miyako/Miyako_v1.5pre4.zip

Miyakoに関する情報はWikiより。
http://wiki.fdiary.net/MiyakoDevSrc/

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

include Miyako

@base = Sprite.new(:size=>[640,40], :type=>:ac)
@font = Font.sans_serif
@font.size = 32

#時間を描画するスレッドを作成
@th = Thread.new(@base, @font){|spr, font|
  loop do
    spr.fill([0,0,0,0]) # 画像の消去
    # 時刻の描画
    font.draw_text(spr, 
                   Time.now.strftime("ただいまの時刻 %H:%M:%S"),
                   0, 0)
    sleep(0.2) # チラツキを抑えるためにウェイトを掛ける
  end
}

@base.show # 画像表示の許可

Miyako.main_loop do
  break if Input.quit_or_escape?
  # メインでは特に何もしなくても良い?
end

こんなもんでいかがでしょう?

スレッド側では「画像を消去→文字列描画」を行っていますが、画面更新(画面への画像の貼り付け)とのタイミングがずれて「画像消去」の時点で画面更新されてしまい、チラツキが起きてしまったので、スレッド側である程度のウェイトを掛けています。

本当は、メイン側で「画面更新した→画像更新OK」という指令でチラツキを抑えたかったのですが、「すべてスレッド側のターン!」になってしまったので、sleepにしました。

(ちなみに、Miyakoでの画面更新は、Observerパターンを想定した作りにはなっていない)