2017-10-26 14 views
0

응용 프로그램을 헤드리스 모드로 실행 중이며 일부 실행을 위해 지정된 시간 동안 대화 상자를 표시해야합니다.Displayless.getDefault.syncExec()가 헤드리스 모드에서 올바르게 실행되지 않습니다.

위의 코드가 여러 번 호출하고 대화 상자가 나타납니다 처음됩니다

Display.getDefault().syncExec(new Runnable() { 
@Override 
    public void run() { 
     //Jface Dialog code 
     RuntimePauseDialog dlg = new RuntimePauseDialog(); 
     dialogResult = dlg.open(); 
    } 
}); 

코드 샘플. 두 번째 이후부터는 대화 상자가 나타나지 않습니다. 게다가 run()은 전혀 실행되지 않고 멈 춥니 다. syncExec() 안에 초기화 된 Runnable 잠금이 있으며 wait()를 호출합니다. 영원히 대기합니다. (Application freezes) Threads와 관련이 있다고 생각합니다.

참고 : UI 모드에서 실행할 때 동일한 코드가 대화 상자를 여러 번 표시합니다. 문제는 헤드리스 모드에서만 발생합니다.

Stackoverflow에서이 제안을 시도했지만 헤드리스 모드로 실행 중이므로 만들지 않은 Workbench가 없으므로 사용할 수 없습니다.

답변

2

syncExec (및 asyncExec)은 UI 스레드에서 실행되는 메인 Display.readAndDispatch 루프가 있음을 의지합니다. 헤드리스 모드 (headless mode)에서는 그렇지 않습니다. 따라서 이것은 전혀 작동하지 않을 것입니다.

+0

@ greg-449 답장을 보내 주신 데 감사의 말씀을 전합니다.하지만 두 번째 질문이 아닌 첫 번째 질문에 대해 알고 싶습니다. – Sudeep

+0

그럴 경우 많은 디버깅이 필요합니다. 내가 사용하는 macOS에서이 코드는 전혀 실행되지 않고 '코코아 제한으로 인해 주 스레드에서 표시되어야합니다.'오류로 즉시 실패합니다. –

+0

Display.getDefault() Java doc이 말합니다. _ "기본 디스플레이를 반환하고, 그렇지 않으면이 메서드를 호출하는 스레드가 아직없는 경우 사용자 인터페이스 스레드를 만듭니다"_ 헤드리스 모드? – Sudeep