2011-07-05 109 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

相关问题