2017-10-10 6 views
0

하나의 진행률 막대에서 2 개의 중첩 된 작업의 진행률을 렌더링 할 수 있습니까? 여러 디렉토리에서 여러 파일의 행을 읽어야하는 경우를 말합니다. 나는이 코드 조각이 :진행률 작업을 하나의 진행 바아에 넣으십시오. javafx

편집 : 나는 진행률 표시 줄에 액세스 할 수 있지만 한 내가 디렉토리를 가지고, 진행 표시 줄이 0으로 다시 시작되고으로 파일을 확인하게됩니다 오전

final int steps = directories.size(); 
    Task<Integer> task2 = new Task<Integer>() { 

       /** 
       */ 
       @Override 
       protected Integer call() throws Exception { 

        int len = files.length; 
        updateProgress(0, len); 

        for(int i = 0; i < files.length; i++) { 
         final String filename = files[i].getName(); 
         final String file = files[i].getPath();  

         try { 
          BufferedReader br = new BufferedReader(new FileReader(file)); 
          } 

          String currentLine = null; 

          while ((currentLine = br.readLine()) != null) { 

           readlines(currentLine, filename); 
          } 

         } catch (IOException xs) { 
          xs.getMessage(); 
         } 

         System.out.println("******* Working on: " + file + " ******************************"); 
         updateProgress(i + 1, files.length); 
        } 

        System.out.println("done: " + directoryName); 

        return len; 
       } 
      }; 

    task2.setOnRunning(r -> { 
       DoubleBinding totalProgress = null; 

       for(int i = 0; i < steps; i++) {  
        DoubleBinding increment = task2.progressProperty().divide(steps); 

        if (totalProgress == null) { 
         totalProgress = increment; 
        } else { 
         totalProgress = totalProgress.add(increment); 
        } 
       } 

       progressBar.progressProperty().bind(totalProgress); 
       status.textProperty().bind(task2.stateProperty().asString()); 
       statusProcess.textProperty().bind(Bindings.when(totalProgress.isEqualTo(-1)) 
         .then("0.00") 
         .otherwise(task2.progressProperty().multiply(100.00).asString("%.02f %%"))); 

       console.textProperty().bind(task2.messageProperty()); 

      }); 

    new Thread(task2).start(); 

다음 디렉토리로 이동 한 다음 진행 표시 줄을 1까지 채우고 다른 디렉토리가 있으면 0으로 다시 시작하십시오.

다음 디렉토리가 읽을 때 0에서 다시 시작하고 싶지 않으므로이 두 작업을 하나로 표시하려면 어떻게해야합니까? 예를 들어 4 개의 디렉토리가있는 경우 분기가 될 때까지 진행 막대가 이동하는 것을 볼 수 있습니다.

내가 뭘 잘못하고 있는지 생각하는 사람이 있습니까? 당신은 쉽게 각 작업에 소요되는 상대적인 시간을 추정하거나 계산할 수있는 경우

답변

0

당신은

progressBar.progressProperty().bind(Bindings.createDoubleBinding(
    () -> Math.max(0, task1.getProgress())/2 + Math.max(0, task2.getProgress()) /2 , 
    task1.progressProperty(), task2.progressProperty()); 

과 같은 작업을 수행 할 수 있습니다, 당신은 단순히 코드로 평균 대신, 그에 따라 각 작업의 진행 상황을 가중 할 수 있습니다 위.

+0

답장을 보내 주셔서 감사합니다. 그러나 저에게는 도움이되지 않습니다. 내가 제안하는대로 진행하면 progressBar가 약 50 %의 파란색 막대를 표시하고 약 60 %의 디렉토리를 변경할 때 100 % 이상 실행됩니다. – cy8el1us

+0

@ cy8el1us 아, 알았어. 원래 코드는 충분합니까? 두 번째 작업에서 진행률을 0으로 반복 설정하는 이유는 무엇입니까? 일반적으로 얼마나 많은 파일을 여기서 반복합니까? –

+0

아니요! 코드를 줄이고 지금은 하나의 작업 만 사용하고 있습니다. 파일을 읽는 메소드에 대한 작업 액세스가 동기화되지 않은 것처럼 보일 때 결과는 모든 파일의 혼합입니다.이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 내 편집을 참조하십시오 – cy8el1us