2017-03-06 15 views
0

私はJavaFXで作業していて、非常に大きなファイルを解析しています。UIスレッドとの同期

私は解析を処理するクラスでこれをやっていますし、進行中のUIをロックしないように新しいスレッドを作成しています。ここで

は、私のコードの抜粋です:

Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 

     try 
     { 
      // ... Do parsing in here 
     } 
     catch(Exception ex) 
     { 
      // ... Show Exception 
     } 
     } 
    }); 

    thread.start(); 

私のUI(それがUIに表示されている)解析されたデータに依存しています。

このスレッドとUIスレッドを同期させて、ファイルの解析中にUIが更新されることはありますか?

+1

単一のオブジェクトがUIを更新するのに十分な情報である場合の 'Task.updateValue'。それ以外は 'Platform.runLater' ... – fabian

+0

私はPlatform.runLaterを試しましたが、UIを更新していないようです。 –

+0

@timbobagginsあなたが望むように動作しないコードを手に入れたい場合は、そのコードを質問に含めます。 –

答えて

0

あなたはこのようなことをすることができます。

final int size = //determine the size of the file; 
     Service<Void> service = new Service<Void>() { 
      @Override 
      protected Task<Void> createTask() { 
       return new Task<Void>() { 
        @Override 
        protected Void call() throws Exception { 
         loop while parsing... { 
          Platform.runLater(() -> updateProgress(getWorkDone() + 1, size)); 

         } 
         return null; 
        } 
       }; 
      } 
     }; 

     service.setOnFailed(event -> //error handling); 
     progressIndicator.visibleProperty().bind(service.runningProperty()); 
     progressIndicator.progressProperty().bind(service.progressProperty()); 
     service.start(); 
+0

アプリケーションスレッドで 'updateProgress'を行う必要はありません。 'progress'プロパティの変更はアプリケーションスレッドで自動的に行われます... – fabian

+0

@fabian runLater()FXがなければ、FXスレッドでタスクの更新が許可されていないという不満がありました。それは変だった。コンパイルの問題を後で修正して追加しました。 –

+0

javadocを見てください:https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html#updateProgress-long-long-次の文が含まれています。*「このメソッドどのスレッドからでも呼び出すことができます。 "さらに、これは 'javac'を使用して得られるコンパイルエラーではありません... – fabian