2010-10-28 97 views
0

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對象是線程不安全的,即它們可以從多個線程訪問,但是訪問它們必須被序列化。在「窗口限制」下,它確實聲明可以從輔助線程創建窗口。

回答

0

事實證明,這崩潰發生如果傳遞給NSWindow框架矩形的大小是無效的,不管線程其所謂的。

事實證明,我的幀大小是未初始化,並且該值是巧合「合法」,當我從主線程創建的窗口。

有了一個有效的大小,所有的線程似乎能夠調用的[NSWindow initWithContentRect:]。

1

這不是我讀的時候說的。 :-)

在「線程安全類」報頭,NSWindow列出。在「窗口限制」(強調我的)下,有限制。在本指南的後面,參考Windows提到了繪圖注意事項。

總之,你可能需要發佈你的窗口創建代碼。

更大的問題要問的是,爲什麼有必要在你的情況下,從輔助線程創建的窗口?您可以通過在其他線程中工作來避免所有這些問題,然後更新主線程上的UI(使用-performSelectorOnMainThread:withObject:waitUntilDone:)。

+0

的確如此。我的問題是,在窗口限制下,它確實聲明Windows可以從輔助線程創建。 – 2010-10-29 05:36:52

+0

是的,他們可以*創造*但你可能還在做其他事情。沒有更多的細節,我可以做的不過是猜測。另外,根據我的最後一段,我幾乎可以保證你通過操縱其他線程的GUI來讓自己陷入困境。如何描述你的目標? – 2010-10-29 11:15:10

+0

我可能會做其他事情,但窗口限制並不排除做其他事情。由於該窗口尚未創建,我甚至不會將NSWindow *存儲在成員變量中,所以我似乎沒有違反任何合同。 – 2010-10-29 17:41:17