MacRuby DoJo (道場)

ストップウォッチを作る (Thread 編)

ストップウォッチを作るでは NSTimer を使って定期的に Text Field の内容を更新していました。同じ事を Ruby の Thread を使って実現することができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class AppDelegate
  attr_accessor :window
  attr_accessor :textField # アウトレット
  def applicationDidFinishLaunching(a_notification)
    # Insert code here to initialize your application
  end

  def startTimer(sender)
    if @thread.nil?
      @time = 0.0
      @thread = Thread.start do
        loop do
          string = sprintf("%.1f", @time)
          textField.stringValue = string

          sleep 0.1
          @time += 0.1
        end
      end
    end
  end

  def stopTimer(sender)
    if @thread
      @thread.kill
      @thread = nil
    end
  end
end

ストップウォッチを作ると同じように UI 部品を配置し、アウトレットとアクションメソッドを接続します。

NSTimer の長い呼び出しの記述が無くなっただけで、ずいぶん Ruby らしくなったのではないでしょうか。

また Text Field に文字列を設定するメソッドとして、今回は stringValue= を使用しています。MacRuby には foo= というメソッドを setFoo と読み替える仕組みがあり、それを活用するとより Ruby らしいコードになるのではないでしょうか。

今回の Text Field のように、UI を更新する場合には単一のスレッドで行いましょう。(NSTimerを使ったものは、メインスレッドで更新しています)

Comments