MacRuby DoJo (道場)

Dispatch モジュール

Mac OS X 10.6 から追加された Grand Central Dispatch (GCD) を利用するために、MacRuby には Dispatch モジュールと、以下のようにいくつかのクラスがあります。

RubyGems の Dispatch ライブラリを用いると、より簡単に GCD を使うこともできます。

Dispatch モジュールの定数

Dispatch::TIME_NOW

「処理をすぐに開始する」と指示するときに使用します。GCD API で DISPATCH_TIME_NOW として定義されている定数と同じ定数です。

1
2
3
4
gcdq = Dispatch::Queue.new('sample')
gcdq.after(Dispatch::TIME_NOW) { puts "Hello" }

sleep 0.5

Dispatch::TIME_FOREVER

処理が完了するのをタイムアウトなしで待ち続けたりするときに使用します。GCD API で DISPATCH_TIME_FOREVER として定義されている定数と同じ定数です。

1
2
3
4
5
6
7
8
9
10
11
12
gcdq = Dispatch::Queue.new('sample')
sema = Dispatch::Semaphore.new(0)
gcdq.async {
  puts "Hello, "
  sleep 1
  sema.signal
}

puts "Waiting..."

sema.wait(Dispatch::TIME_FOREVER)
puts "World"

Dispatch モジュールのメソッド

Dispatch#resume!

中断されている処理を再開します。GCD API の dispatch_resume に相当します。

  • resume!
1
2
3
4
5
6
7
8
9
10
gcdq = Dispatch::Queue.new('sample')
gcdq.after(Dispatch::TIME_NOW) {
  sleep 0.5
  puts "Hello"
}
gcdq.suspend!
gcdq.suspended?  #=> true
gcdq.resume!

sleep 1

Dispatch#suspend!

処理を中断します。GCD API の dispatch_suspend に相当します。

  • suspend!

Dispatch#suspended?

処理が中断されているかを返します。

  • suspended? -> bool
    • [RETURN]
      • 処理が中断されていれば true、そうでなければ false を返します。

Dispatch#dispatch_object

dispatch_object_t のオブジェクトを返します。Cocoa API で dispatch_queue_t などのオブジェクトが必要なときに用います。Dispatch::Queue などのオブジェクトは MacRuby 独自のものなので、このメソッドが返すオブジェクトを Cocoa API に渡す必要があります。

  • dispatch_object -> object
    • [RETURN]
      • dispatch object を返します。
1
2
3
gcdq = Dispatch::Queue.new('doc')
output = AVCaptureVideoDataOutput.new
output.setSampleBufferDelegate(self, queue: gcdq.dispatch_object)

Comments