2012-12-04 5 views
1

나는 Swing 애플 리케이션을 가지고 열 JNI 메서드 호출을합니다. 일부 컴퓨터에서는 (불행하게도 그들 사이에 유사점을 찾지 못했습니다) 완전히 앱을 중단합니다. 대부분의 컴퓨터에서 제대로 작동합니다. 코드가 특정 Mac에서 앱을 정지 시키면 코드가 실행될 때마다 코드가 실행됩니다. 여기NSOpenPanel 자바 애플 리케이션

내가 NSOpenPanel 열 방법은 다음과 같습니다

JNF_COCOA_ENTER(env);  
// My helper Obj-c object to make a selector call 
OpenFileObject *openFile = [[OpenFileObject alloc] init];  
if ([NSThread isMainThread]) 
    [openFile showOpenFileDialog]; 
else 
    [JNFRunLoop performOnMainThread:@selector(showOpenFileDialog) on:openFile withObject:nullptr waitUntilDone:TRUE]; 
// ...Handles results  
JNF_COCOA_EXIT(env); 

을 여기 showOpenFileDialog 방법 :

NSOpenPanel *panel = [NSOpenPanel openPanel]; 
[panel setCanChooseFiles:canChooseFiles]; 
[panel setCanChooseDirectories:canChooseFolders]; 
[panel setAllowsMultipleSelection:allowMultiSelection]; 
[panel setAllowedFileTypes:fileTypes]; 
[panel setTitle:dialogTitle]; 

if ([panel runModal] == NSFileHandlingPanelOKButton) 
    urls = [[panel URLs] copy]; 
else 
    urls = nullptr; 

여기 단절 보고서입니다 : https://gist.github.com/4207956

어떤 아이디어? 먼저

답변

1

, 나는이 문제와 아무 상관이 의심하지 않지만, performOnMainThread:...에 인수 대신 내가 할 것처럼 나는 nullptrTRUE를 사용하여주의 것 :

[JNFRunLoop performOnMainThread:@selector(showOpenFileDialog) on:openFile withObject:nil waitUntilDone:YES];

단지에있을 안전한 쪽.

스택 추적에서 하나의 큰 스택이라고 가정하고 도우미 개체 메서드 호출에 대한 설명을 추가하기 위해 방금 분리했다고 가정하면 코드 경로는 [NSThread isMainThread]이 NO를 반환하는 코드 경로 인 것처럼 보입니다. 이는 배경 스레드에 있음을 의미합니다 (__NSThreadPerformPerformJNFRunLoop의 입찰을 수행함).

스택은 NSOpenPanel의 초기화 경로에서 결코 벗어나지 않으며, 바닥에서 어떻게 든 깊은 곳까지 다시 실행 루프 상황에 액세스합니다. 내 마음 속에서, 어떤 종류의 교착 상태가 발생하는 것처럼 보입니다.

JNFRunLoop 경우 메인 실행 루프에 완료 showOpenFileDialog 방법의 실행에 다른 스레드에서 대기하고 openPanel에 뭔가 교착 상태가 발생할 수 있습니다 즉, 동일한 실행 루프 것들에 기다릴 노력하고있다.

Java와 Cocoa의 통합에 익숙하지 않지만, 주 스레드가 아닌 다른 스레드에서 첫 번째 코드 스 니펫을 실행하지 않도록 할 수있는 방법이 있습니까?

다른 방법으로 사용해 볼 수 있습니다 : 비 메인 스레드 경로에서

[openFile performSelectorOnMainThread:@selector(showOpenFileDialog) withObject:nil waitUntilDone:YES];

를?

+0

아마 관련이 없지만 버퍼 오버런 때문에 유사한 스택에서 충돌에 대한 이야기를 찾았습니다. http://www.cocoabuilder.com/archive/cocoa/130423-nssavepanel-crashing-on-instantiation.html – lyricsboy

관련 문제