SSブログ

CFRunLoopSourceの使い方その6 [考え中の問題]

機能はスレッド制御のためのメカニズムのうちMacOS X独自の追加であるCFRunLoopとCFRunLoopSourceというのがある、ということだけを見た。今日はCFRunLoopSourceの生成とCFRunLoopへの組み込みをおさらいする。

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はどんなモードでもソースが呼ばれるということを指定する。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立02/09献立02/10 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。