0

대규모 SWT 기반 응용 프로그램에서 작업 AWT/Swing 브리지를 사용하여 일부 코드를 우연히 발견하여 두 개의 GUI 스레드를 사용하는 의미에 대해 생각하게했습니다. 당신이 스윙 요소를 많이 짐작으로, 세부 사항으로하지 않고SWT와 AWT/Swing 결합 : 어떤 GUI 스레드를 사용할 수 있습니까?

public void createContent(final String html) { 
    // Bridge to AWT 
    frame = SWT_AWT.new_Frame(this); 
    rootPane = new JPanel(); 
    rootPane.setLayout(new GridBagLayout()); 
    JRootPane rp = new JRootPane(); 
    rp.getContentPane().add(rootPane); 
    rp.validate(); 
    frame.add(rp); 
    frame.validate(); 

    // Create components in AWT user interface thread (deadlock prevention) 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      initializeLookAndFeel(); 
      initializeToolbar(); 
      initializeHTMLEditor(); 
      setHTML(html, false); 
     } 
    }); 

    rootPane.repaint(); 
    rootPane.validate(); 
} 

초기화 방법 내부의 "다리 프레임"에 추가됩니다.

이 경우 나를 혼란스럽게하는 것은 Swing 구성 요소 생성을위한 AWT 이벤트 발송자 스레드 (EDT) 호출입니다. SWT UI 스레드 안에 모든 GUI 요소를 추가했을뿐입니다. 왜 두 스레드간에 GUI 작성을 분할하는 것이 바람직한 지 잘 모르겠습니다.

아마 누군가는 장면 뒤에서 일어나는 일에 대해 자세히 설명 할 수 있습니다. 특히 다리를 사용하여 두 스레드의 상호 작용에. 코드 예제 에서처럼 EDT에 AWT 항목 작성을 전달하는 것이 왜 또는 언제 필요합니까?

+0

에서 Display.syncExec(....) 또는 Display.asyncExec(....) 및 SWING들 중 하나와 함께 적절한 스레드 내에서 SWT 것들을 처리하는 모든 위젯을 호출하는 내 어머니는 내가 어렸을 때하지 말아야 할 말한 것들 중 하나입니다이 ... –

+0

+ 70k 라인 레거시 프로젝트에 대한 한 사람의 쇼이기 때문에 그것에 대해 논할 입장이 아닙니다;) – Johnson

답변

0

SWT에서는 시스템 신호를 보내기 전에 checkWidget 메서드 호출이 있기 때문에 모든 UI 요소는 UI 스레드 내에서 작성/처리/액세스되어야합니다. 이 메서드는 현재 스레드가 UI 스레드인지 여부를 확인하고 오류를 throw합니다. 이 선택의 이유는 그래픽 컨텍스트 액세스가 단일 스레드이므로 스윙에도 적용됩니다. 따라서 당신은 SWT와 스윙을 믹싱 EventQueue 스레드

+0

AWT EventQueue 내에서 SWT 요소를 만드는 것이 실패 할 가능성이 높습니다. 'checkWidget' 메소드. 그러나 SWT UI 스레드 내에서 AWT 구성 요소를 만드는 또 다른 방법은 AWT에 그러한 "온 전성 검사"가 없을 것 같기 때문에 작동합니다. 결국 GUI 실행에 방해가되는 장기 실행 작업을 방지하는 것이 전부가 아닌가? UI 스레드가 UI 스레드 중 하나에서 수행되는 한 UI 작업이 실행되는 곳은 무관해야하지 않습니까? 사실 두 UI 스레드를 모두 사용하면 작업 순서가 더 이상 보장되지 않습니다. – Johnson

+1

@ 존슨 UI 스레드 중 하나에서 UI 작업이 실행되는 한 무관심하지 않아야합니까? 이론적으로는 Swing이 자체 구성 요소를 "그리며"SWT가 "시스템 구성 요소를 호출하기 때문에" 이것은 제자리에 놓기가 어려울 것입니다. –

+1

'사실, 두 UI 스레드를 모두 사용하면 더 이상 작업 순서가 보장되지 않습니다 .' 완전히 동의하므로 가능한 한 스레드 동기화를주의 깊게 사용해야하며이 문제의 한 가지 예는 이벤트입니다 급파. –