はじめてのスレッドプログラミング−時計プログラム
よくよく考えてみたら、当方、マルチスレッドを使ったプログラムを書いたことがなかった。
たぶん、資料を読んでみて、「なんとなく難しそう」と思って意図的に避けていたわけだが(要するに食わず嫌い)。
しかも、なぜかマルチスレッドを扱う仕事が無かった(もしかしたら、気づいてなかっただけかもしれない)。
とはいえ、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パターンを想定した作りにはなっていない)