SSブログ

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

昨日はCFRunLoopSourceの作り方を見た。まあ、Core Foundationのオブジェクトを作るやり方と基本的には同じ。ただひとつ、performコールバックをちゃんと設定する、ということが重要。
今日はその使い方について。

4.5  runLoopSourceの起動

作業の準備ができたらメインスレッドからソースを起動する。それは
void CFRunLoopSourceSignal (
   CFRunLoopSourceRef source
);
と言う関数を呼ぶ。そうすれば実行ループの次の回でソースに設定されたperformコールバック関数が実行される、という手はずになる。

Cocoa/Objective-Cのperform????では一度実行されるとNSRunLoopからは削除されるけど、CFRunLoopSourceは明示的に除去しない限りずっと残っていてCFRunLoopSourceSignalを呼び直せば何度でも起動されるという仕様になっている。

4.6  RunLoopSourceの除去

この状態では、スレッドが終わらない限りCFRunLoopSourceSignal関数を呼べばコールバックが起動される。

それをやめたいときは
まず
void CFRunLoopSourceInvalidate (
   CFRunLoopSourceRef source
);
を呼んで無効化し、さらに
void CFRunLoopRemoveSource (
   CFRunLoopRef rl,
   CFRunLoopSourceRef source,
   CFStringRef mode
);
として実行ループから取り除く。このあとソースが不要ならリリースすればいい。

4.7  perform以外のコールバック関数

perform以外のコールバックは何をするものかと言うと、
CFRunLoopScheduleCallBack
ソースがループに取り付けられた
CFRunLoopCancelCallBack
ソースがループから除去された(CFRunLoopRemoveSource)
CFAllocatorRetainCallBack
info(RefCon)が保持された(CFRetain)
CFAllocatorReleaseCallBack
info(RefCon)がリリースされた(CFRelease)
CFAllocatorCopyDescriptionCallBack
infoがコピーされた(CFCopy)
CFRunLoopEqualCallBack
ふたつのinfo(RefCon)が比較された(CFEqual)
CFRunLoopHashCallBack
info(RefCon)のハッシュ値を返す(CFHash)
などがある。infoがCore Foundationのオブジェクトであれば3つめ以降のコールバックはCore Foundationの関数でよく見かけるものである(が実際に設定したことはないけどね)。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

献立02/10コーヒーからの伝言 ブログトップ

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