如何创建仅侦听performSelector:onThread:和GUI事件的运行循环?

时间:2010-04-13 19:43:41

标签: cocoa multithreading

我想创建一个运行自己窗口的单独线程。坦率地说,文档对我来说没有意义。

所以我创建了一个带有main函数的NSThread。我启动线程,创建一个NSAutoreleasePool,然后运行run loop:

// Global:
BOOL shouldKeepRunning = YES;

- (void)threadMain {
    NSAutoreleasePool *pool = [NSAutoreleasePool new];
    // Load a nib file, set up its controllers etc.
    while (shouldKeepRunning) {
        NSAutoreleasePool *loopPool = [NSAutoreleasePool new];
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
        [loopPool drain];
    }
    [pool drain];
}

但是由于没有注册端口或观察者,runUntilDate:立即退出,CPU利用率达到100%。

通过调用performSelector:onThread:withObject:waitUntilDone:来处理所有线程通信。显然,我没有正确使用API​​。那么,我做错了什么?

1 个答案:

答案 0 :(得分:4)

当在主线程外部操作时,大部分AppKit都不是线程安全的,并且将无法正常工作(1)。你会发现只有痛苦和痛苦才会忽视这一事实。

你真正想要做什么需要为这个窗口设置不同的线程?您是否只是想保持响应式用户界面?如果是这样,那么很多更好的方法。参见NSOperation / NSOperationQueue(其中“工作单元”和“队列”是焦点,而不是“此窗口应在此线程上运行,等等。”)。

我建议您明确详细说明您的具体目标。

(1)对于某些课程,需要做很多细致的工作。对于其他人来说,他们完全没有限制。