multithreading - 从工作线程崩溃中创建 NSWindow?

标签 multithreading cocoa

Thread Safety Summary developer.apple.com 上声明 NSWindow 是线程安全的*并且可以从工作线程创建。

我有一个工作线程,我创建得相当简单:

  [NSThread detachNewThreadSelector:@selector(threadProc:)
                           toTarget:self
                         withObject:nil];

尝试创建一个 NSWindow。我曾经将创建调用编码到主线程上并且它起作用了,阅读了线程安全摘要我尝试简单地在工作线程上创建它,但我遇到了这个崩溃:

Thu Oct 28 15:13:15 trans.mshome.net MyApp[99962] <Error>: kCGErrorRangeCheck: CGSNewWindowWithOpaqueShape: Cannot create window
Thu Oct 28 15:13:15 trans.mshome.net MyApp[99962] <Error>: kCGErrorFailure: Set a breakpoint @ CGErrorBreakpoint() to catch errors as they are logged.
2010-10-28 15:13:15.192 MyApp[99962:5903] An uncaught exception was raised
2010-10-28 15:13:15.194 MyApp[99962:5903] Error (1007) creating CGSWindow
2010-10-28 15:13:15.195 MyApp[99962:5903] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error (1007) creating CGSWindow'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x91b5ebba __raiseError + 410
    1   libobjc.A.dylib                     0x96e9c509 objc_exception_throw + 56
    2   CoreFoundation                      0x91b5e8e8 +[NSException raise:format:arguments:] + 136
    3   CoreFoundation                      0x91b5e85a +[NSException raise:format:] + 58
    4   AppKit                              0x94e5ac2d _NXCreateWindow + 316
    5   AppKit                              0x94e5aa38 _NSCreateWindow + 59
    6   AppKit                              0x94e59c5e -[NSWindow _commonAwake] + 1784
    7   AppKit                              0x94e56886 -[NSWindow _commonInitFrame:styleMask:backing:defer:] + 1524
    8   AppKit                              0x94e554d9 -[NSWindow _initContent:styleMask:backing:defer:contentView:] + 1568
    9   AppKit                              0x94e54eb3 -[NSWindow initWithContentRect:styleMask:backing:defer:] + 71
    10  acmeFrame.dylib                     0x028e300b _ZN11Acme12CCocoaWindow12CreateWindowEPKciiiij + 517
    18  acmeFrame.dylib                     0x00011ac4 -[CocoaThread threadProc:] + 136
    19  Foundation                          0x92dd28d4 -[NSThread main] + 45
    20  Foundation                          0x92dd2884 __NSThread__main__ + 1499
    21  libSystem.B.dylib                   0x94b3b81d _pthread_start + 345
    22  libSystem.B.dylib                   0x94b3b6a2 thread_start + 34
<小时/>

更正:它指出 NSWindow 对象是线程不安全的 - 即它们可以从多个线程访问,但对它们的访问必须序列化。然而,在“窗口限制”下,它确实声明可以从辅助线程创建窗口。

最佳答案

我读到的时候可不是这么说的。 :-)

在“线程不安全类”标题下,列出了 NSWindow。在“窗口限制”(强调我的)下,有一些限制。稍后在指南中,将引用 Windows 提到绘图注意事项。

简而言之,您可能需要发布窗口创建代码。

要问的更大问题是,为什么在您的情况下有必要从辅助线程创建窗口?您可以通过在其他线程中执行工作然后更新主线程上的 UI(使用 -performSelectorOnMainThread:withObject:waitUntilDone: )来避免所有这些问题。

关于multithreading - 从工作线程崩溃中创建 NSWindow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4043371/

相关文章:

java - join(long millis) 在以下示例中如何工作?

objective-c - 使用 Coca 应用程序中的默认复制菜单项复制 NSTableView 行或列的内容

C++ 带定时器的多线程编程

objective-c - Cocoa - NSThread 和急救人员

multithreading - 使用 cocoa 装订线和线

cocoa - 如何以编程方式将一个 Terminal.app 窗口移动到另一个空间?

iphone - 为什么我的核心动画转换总是返回到它的开始状态?

c# - 非阻塞键/值存储

c++ - 双重检查线程安全单例和无锁的创建

java - 修改参数的值