2012-06-27 3 views
1

JavaFx의 API에서 Task class을 사용하여 네트워크 작업을 수행하고 있습니다. 클래스는이 상황에 완벽하게 적용되는 진행 시스템을 제공합니다. 예를 들어 호출자 스레드에 업로드 된 파일의 양을보고 할 수 있습니다. 이를 위해 파일이 성공적으로 업로드 될 때마다 updateMessage(x + "files uploaded")으로 전화합니다.작업의 updateMessage()를 즉시 만들 수 있습니까?

내가받는 유일한 메시지는 모든 파일이 업로드 된 마지막 메시지입니다. 반드시 발생하지 않을 수 updateMessage에

통화가 합체 나중에 FX 응용 프로그램 스레드에서 실행, updateMessage 호출, 그래서 심지어 FX 응용 프로그램 스레드에서 :이 현상은 자바 독에 의해 어떤 방법으로 설명 추측 이 속성에 대한 즉각적인 업데이트 및 중간 메시지 값이 병합되어 이벤트 알림을 저장할 수 있습니다.

모든 메시지 또는 일부 메시지를 올바르게보고하려면 어떻게해야합니까? 주위에 Thread.sleep (20)를 추가하려고했지만 작동하지 않습니다. 어떤 생각?

+1

이 질문이 너무 현지화 된 것을 볼 수 없습니다. 주제는 태스크 내의 JavaFX 메시지 처리입니다. –

답변

3

대부분의 경우 이벤트 스레드에서 작업을 실행 중이므로 업데이트를 차단합니다. 작업은 약간 오해의 소지가의 Runnable을 구현하지만 자바 독에 보면 당신은 작업을 실행하는 올바른 방법은 새로운 Thread에 assinging 것을 알 수 있습니다 :

new Thread(task).start(); 다음 예를 참조하십시오 :

public class TaskTask extends Application { 
    public static void main(String[] args) { launch(args); } 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle(VersionInfo.getRuntimeVersion()); 
     Button btn = new Button(); 

     final Task<Integer> task = new Task<Integer>() { 
      @Override 
      protected Integer call() throws Exception { 
       int iterations; 
       for (iterations = 0; iterations < 100; iterations++) { 
        if (isCancelled()) { 
         break; 
        } 
        Thread.sleep(100); // imitate activity 
        updateMessage("Iteration " + iterations); 
       } 
       return iterations; 
      } 
     }; 

     // here we monitor task updates 
     btn.textProperty().bind(task.messageProperty()); 

     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       //here it goes 
       new Thread(task).start(); 
      } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 
     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.show(); 

    } 
} 
+0

문서에 표시된대로 스레드에서 작업을 시작합니다. 그러나 updateMessage()를 호출하는 메서드는 동기화되어 있습니다. 실제로는 중첩 된 작업과 wait() 및 notify()가 던져진 더 복잡한 구조입니다. 이것이 원인이라고 생각하십니까? – Timst

+0

예를 들어 주셔서 감사합니다. 문제는 실제로 그들의 방출이 아니라 갱신의 응접에서왔다. – Timst

1

좋아 내 결점. 나는 메시지 갱신을 잘못 듣고 있었다 : 나는 messageProperty의 ChangeListener 대신에 TaskHandler를 Task에 사용했다. javadoc은 업데이트를 보내는 방법 만 알려주지 만, 시도하지는 않았지만 세르게이의 대답은 올바른 방법입니다.

관련 문제