2017-10-10 7 views
0

2つのネストされたタスクの進行状況を1つのプログレスバーに表示できますか? 複数のディレクトリにある複数のファイルから行を読み込む必要がある場合は、進捗タスクを1つのプログレスバーに入れます。javafx

EDIT:

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(); 

私はプログレスバーにアクセスすることを可能にしていますが、限り、私はディレクトリを持っているように、プログレスバーが0に再起動し、にファイルをチェックします私はこのスニペットコードを持っています次のディレクトリに移動し、1になるまで進捗バーを設定し、別のディレクトリがある場合は0に再起動します。

これらの2つのタスクを1つに表示したい場合は、次のディレクトリが読み込み中に再起動しないようにするにはどうすればよいですか。例えば4つのディレクトリがある場合、私は4分の1までプログレスバーを動かすことを期待しています。

私が間違っているアイデアは誰ですか?あなたは簡単に各タスクがかかります相対時間を推定または計算することができる場合

答えて

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 Ah、ok、元のコードで十分ですが、なぜ2番目のタスクで進捗をゼロにリセットしているのですか?通常、ここで何回繰り返しますか? –

+0

いいえpb!コードを減らして今は1つのタスクしか使用していませんが、ファイルを読み込むメソッドへのタスクアクセスが同期していないように見えるので、結果はすべてのファイルが混在しています。これを修正する方法はありますか?私の編集 – cy8el1us

関連する問題