gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:03:40 31 4
gpt4 key购买 nike

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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com