developer.apple.com上的Thread Safety Summary指出NSWindow是線程安全*,可以從工作線程創建。從工作者線程崩潰創建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對象是線程不安全的,即它們可以從多個線程訪問,但是訪問它們必須被序列化。在「窗口限制」下,它確實聲明可以從輔助線程創建窗口。
的確如此。我的問題是,在窗口限制下,它確實聲明Windows可以從輔助線程創建。 – 2010-10-29 05:36:52
是的,他們可以*創造*但你可能還在做其他事情。沒有更多的細節,我可以做的不過是猜測。另外,根據我的最後一段,我幾乎可以保證你通過操縱其他線程的GUI來讓自己陷入困境。如何描述你的目標? – 2010-10-29 11:15:10
我可能會做其他事情,但窗口限制並不排除做其他事情。由於該窗口尚未創建,我甚至不會將NSWindow *存儲在成員變量中,所以我似乎沒有違反任何合同。 – 2010-10-29 17:41:17