CFRunLoopSourceの使い方その7 [考え中の問題]
昨日はCFRunLoopSourceの作り方を見た。まあ、Core Foundationのオブジェクトを作るやり方と基本的には同じ。ただひとつ、performコールバックをちゃんと設定する、ということが重要。
今日はその使い方について。
Cocoa/Objective-Cのperform????では一度実行されるとNSRunLoopからは削除されるけど、CFRunLoopSourceは明示的に除去しない限りずっと残っていてCFRunLoopSourceSignalを呼び直せば何度でも起動されるという仕様になっている。
それをやめたいときは まず
今日はその使い方について。
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)
2011-02-10 21:14
nice!(0)
コメント(0)
トラックバック(0)
コメント 0