我想创建一个运行自己窗口的单独线程。坦率地说,文档对我来说没有意义。
所以我创建了一个带有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。那么,我做错了什么?
答案 0 :(得分:4)
当在主线程外部操作时,大部分AppKit都不是线程安全的,并且将无法正常工作(1)。你会发现只有痛苦和痛苦才会忽视这一事实。
你真正想要做什么需要为这个窗口设置不同的线程?您是否只是想保持响应式用户界面?如果是这样,那么很多更好的方法。参见NSOperation / NSOperationQueue(其中“工作单元”和“队列”是焦点,而不是“此窗口应在此线程上运行,等等。”)。
我建议您明确详细说明您的具体目标。
(1)对于某些课程,需要做很多细致的工作。对于其他人来说,他们完全没有限制。