2011-07-05 75 views
2

我正在寫一個簡單的應用程序,應該能夠使用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 

的問題是,後臺線程的run loop立即退出(返回代碼kCFRunLoopRunFinished代替kCFRunLoopRunTimedOut ),因爲沒有源/觀察者/定時器。 CFNotificationCenterAddObserver只註冊主線程的運行循環,而不是我的後臺線程。

我需要一些其他東西的主線程,不能用它來運行它的運行循環。有什麼辦法可以使這個工作?也許通過註冊CFNotificationCenter與後臺線程的運行循環?

在此先感謝!

回答

1

作爲第一時間觀測與分佈式通知中心登記在http://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFNotificationCenterRef/Reference/reference.html

所述,通知中心創建具有系統範圍的通知服務器的連接和監聽端口放入的電流的共模線程的運行循環。當傳遞通知時,即使正在接收通知的觀察者在另一個線程上註冊通知,它也會在此初始線程上處理。

因爲加載的框架可能會在您的代碼執行之前產生線程並添加自己的觀察器,您無法確定哪個線程將接收到分佈式通知。如果您需要控制哪個線程處理通知,您的回調函數必須能夠將通知轉發給適當的線程。您可以使用CFMessagePort對象或自定義的CFRunLoopSource對象將通知發送到正確的線程運行循環。

+0

感謝您的回答。我也讀過那篇文章,但這並不能解決我的問題。爲了接收通知,主線程中需要CFRunLoop。應該有辦法解決這個問題。 – Benjamin

+0

實現您自己的通知中心,該中心將關注線程的運行循環。 – Andrew

+0

也想到了這一點,但我無法弄清楚如何將它連接到distnote守護進程。核心基金會的這部分似乎是封閉的來源。而且我不確定未來的解決方案將如何。蘋果公司可能會在某些時候改變一些內部零件 – Benjamin

相關問題