AppleのCoreFoundationフレームワークを使用してバックグラウンドスレッドで通知を受信して処理できる単純なアプリケーションを作成しています。ここで私が達成しようとしているものです:CoreFoundation:バックグラウンドスレッドでの受信/プロセス通知
static void DummyCallback(CFNotificationCenterRef center,
void *observer,
CFStringRef name,
const void *object,
CFDictionaryRef userInfo) {
printf("RECEIVED NOTIFICATION\n");
}
void *ThreadStart(void *arg) {
CFNotificationCenterAddObserver(CFNotificationCenterGetDistributedCenter(),
NULL,
&DummyCallback,
NULL,
CFSTR("TEST_OBJECT"),
CFNotificationSuspensionBehaviorDeliverImmediately);
printf("background thread: run run loop (should take 5 sec to exit)\n");
int retval = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 5, true);
printf("background thread: exited from run loop (retval: %d)\n", retval);
return NULL;
}
int main(int argc, char** argv) {
pthread_t thread;
int rc = pthread_create(&thread, NULL, &ThreadStart, NULL);
assert(rc == 0);
printf("main: sleep\n");
sleep(10);
printf("main: done sleeping\n");
return 0;
}
私はプログラムを実行する場合、私はちょうど
main: sleep
background thread: run run loop (should take 5 sec to exit)
background thread: exited from run loop (retval: 1)
main: done sleeping
を取得する問題ではなくkCFRunLoopRunTimedOutのkCFRunLoopRunFinished(リターンコードすぐにバックグラウンドスレッドの実行ループが終了するということです)ソース/オブザーバー/タイマーがないためです。 CFNotificationCenterAddObserverは、メインスレッドの実行ループでのみ登録され、バックグラウンドスレッドでは登録されません。
私はいくつかの他のもののためにメインスレッドを必要とし、実行ループを実行するために使用することはできません。これを実現する方法はありますか?おそらくCFNotificationCenterをバックグラウンドスレッドの実行ループに登録することによって?
ありがとうございます!
あなたの答えをありがとう。私はその通路も読んだが、これは私の問題を解決しない。通知を受け取るには、メインスレッドでCFRunLoopが必要です。その周りに道があるはずです。 – Benjamin
スレッドの実行ループを気にする独自の通知センターを実装します。 – Andrew
それについても考えましたが、私はそれをdistnotedデーモンに接続する方法を理解できませんでした。 Core Foundationのこの部分は閉鎖されたソースのようです。そして、その解決策が将来どういうものになるかはわかりません。 Appleはある点で内部の一部を変更するかもしれない – Benjamin