CFRunLoopSourceの使い方その6 [考え中の問題]
機能はスレッド制御のためのメカニズムのうちMacOS X独自の追加であるCFRunLoopとCFRunLoopSourceというのがある、ということだけを見た。今日はCFRunLoopSourceの生成とCFRunLoopへの組み込みをおさらいする。
最後の引数は
performコールバック関数は
そのためにはまず実行ループを取得して
modeは実行ループのモードで、kCFRunLoopDefaultModeかあるいはkCFRunLoopCommonModesを指定する。
実行ループにはモードと言う属性がある。実行ループはある一つのモードでだけ動作して、そのモードに所属するソースだけしか監視しない。最初からいくつかのモードが定義されているが適当な文字列を設定すれば実行ループがそのモードで指定されたときだけソースが呼ばれるようになる。
kCFRunLoopDefaultModeはデフォルトのモードでkCFRunLoopCommonModesはどんなモードでもソースが呼ばれるということを指定する。
4.3 runLoopSourceの生成
runLoopSourceはCFRunLoopSourceRef CFRunLoopSourceCreate ( CFAllocatorRef allocator, CFIndex order, CFRunLoopSourceContext *context );というCoure Foundationの関数で作る。allocatorはCore FoundationのCF????Create関数にいつもあらわれる引数で、デフォルトでいいならkCFAllocatorDefaultを渡す。orderはrunLoopに複数のソースが設定されているとき、その値の若い順に実行される。
最後の引数は
struct CFRunLoopSourceContext { CFIndex version; void *info; CFAllocatorRetainCallBack retain; CFAllocatorReleaseCallBack release; CFAllocatorCopyDescriptionCallBack copyDescription; CFRunLoopEqualCallBack equal; CFRunLoopHashCallBack hash; CFRunLoopScheduleCallBack schedule; CFRunLoopCancelCallBack cancel; CFRunLoopPerformCallBack perform; };というもので、ようするにコールバック関数のポインタを詰めた構造体である。versionは0でなければならない。また、infoはいわゆるRefConである。perform以外のコールバックはNULLでもいい。そしてperformコールバックに、作業スレッドで行う実作業を記述する。
performコールバック関数は
typedef void (*CFRunLoopPerformCallBack) ( void *info );という形で、RefConであるinfoを引数にとる関数になる。
4.4 runLoopへの組み込み
runLoopSourceを作業スレッドで実行するためにはそのスレッドの実行ループ(CFRunLoop)に組み込むということをする。そのためにはまず実行ループを取得して
void CFRunLoopAddSource ( CFRunLoopRef rl, CFRunLoopSourceRef source, CFStringRef mode );関数を使ってrunLoopSourceをつけたす、ということを行う。rlは実行ループで、sourceがrunLoopSourceである。
modeは実行ループのモードで、kCFRunLoopDefaultModeかあるいはkCFRunLoopCommonModesを指定する。
実行ループにはモードと言う属性がある。実行ループはある一つのモードでだけ動作して、そのモードに所属するソースだけしか監視しない。最初からいくつかのモードが定義されているが適当な文字列を設定すれば実行ループがそのモードで指定されたときだけソースが呼ばれるようになる。
kCFRunLoopDefaultModeはデフォルトのモードでkCFRunLoopCommonModesはどんなモードでもソースが呼ばれるということを指定する。
2011-02-09 21:56
nice!(0)
コメント(0)
トラックバック(0)
コメント 0