자바

2011-01-11 4 views
2
에서 세마포어를 사용하는 방법

나는 잠시받는 함수를 가지고 대기 화면에 표시 할 :자바

Loading.showSplash("Working...");   

for (FileListRow row : model.getList()) { 
    performAction(row); 
} 

Loading.hideSplash(); 

문제가를 그 performAction (행); 로딩 화면 전에 실행 된 것으로 보이고 따라서 목적을 상실합니다.

나머지 화면을 실행하기 전에 대기 화면을 강제로 표시하고 대기 화면이 사라지기 전에 기능을 종료하도록하는 데 도움이되는 도움말입니다.

답변

1

시도해보십시오. Event Dispatch Thread (EDT)에서 GUI 업데이트를 수행하는 모든 코드를 호출해야합니다. 스윙은 스레드로부터 안전하지 않습니다.

 

SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        Loading.showSplash("Working..."); 
       } 
      }); 

new Thread(new Runnable(){ 
       public void run(){ 
        for (FileListRow row : model.getList()) 
        { 
         performAction(row); 
        } 
       } 
      }).start(); 

Loading.hideSplash(); 
 
+0

작동하지 않습니다. 실제로 로딩 화면은 지금 표시되지 않습니다. 실행 한 기능이 완전히 완료되면로드 화면이 나타납니다. – user512684

+0

for 루프를 자체 스레드에서 실행 해보십시오. – user489041

+0

이것은'hideSlash()'를 호출하기 전에 액션 스레드가 끝날 때까지 기다리지 않습니다. – unholysampler

1

이 프로그램이 스윙 프로그램이라고 생각합니까?

그렇다면 이벤트 발송 스레드에서 장기 실행 작업을 수행하는 것처럼 보입니다. 이것은 나쁜 생각입니다. workert hread에서 장기 실행 작업을 모두 수행해야합니다. 자세한 내용은 Java tutorial을 참조하십시오.

백그라운드 스레드에서 장기 실행 작업을 수행하는 경우 확실히 은 수행하지 않습니다. 세마포어를 사용하여 해당 작업이 완료 될 때까지 또는 심지어 시작할 때까지 GUI 스레드를 일시 중지하려고합니다. GUI 스레드는 자유롭게 실행하고 이벤트를 전달할 수 있어야합니다. 그렇지 않으면 UI가 사용자에게 짜증나는 "지연"을 갖게됩니다. 다른 포스터가 지적한 것처럼 작업자 스레드는 SwingUtilities.invokeLater()을 사용하여 UI를 업데이트 할 수 있습니다.

+0

예, 스윙 프로그램입니다. 감사합니다. 자습서를 통해 장기 실행 함수가 작업자 스레드에 있도록 코드를 재구성 할 수있는 방법을 살펴 보겠습니다. – user512684

1

저는 여러분이 스윙 어플리케이션을 개발하고 있다고 가정합니다. SwingWorker 클래스의 javadoc을 읽으십시오 : http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html. 아이디어는 입니다. 1. 스플래시 화면을 표시하십시오. 2. 백그라운드에서 모든 작업을 수행하는 스레드를 시작하십시오. 3. 백그라운드 작업이 끝나면 스플래시 화면을 숨기기

SwingWorker가이를 처리합니다. 다만, 백그라운드 오퍼레이션은, thread 세이프가 아니기 때문에, Swing 관련의 컴퍼넌트 또는 클래스를 사용할 수 없기 때문에, 이벤트 발송 스레드 (EDT)로 실행하지 않으면 안됩니다.

더 간단한 방법은 스플래시 화면을 표시 한 다음 SwingUtilities.invokeLater를 사용하여 작업을 수행하고 스플래시 화면을 숨기는 것입니다. 이렇게하면 모든 것이 EDT에서 수행되지만 스플래시 화면은 다른 작업이 수행되기 전에 표시됩니다. 그러나이 기술을 사용하면 스플래시 화면이 숨겨 질 때까지 응용 프로그램 GUI가 응답하지 않습니다.

+0

흠 ... 흥미 롭습니다. 실제로는 다른 접근법 일 수 있습니다. 대기 화면을 표시하는 주요 목표는 사용자가 놀라지 않고 모든 곳을 클릭하지 않기위한 것입니다. 스플래시 화면이 숨겨 질 때까지 응용 프로그램 GUI가 응답하지 않으면 사실 실제로 필요하지 않습니다. 나는 튜토리얼과 링크를 읽고 개념에 익숙하다. 이제는 코드를 수정하는 것입니다. – user512684

+0

+1 다음은 간단한 'SwingWorker' 예제입니다. http://stackoverflow.com/questions/4637725 – trashgod