2017-07-13 17 views
0

現在、タスクを実行するプログラムがあります(ファイルがインポートされます)。実行中に、ProgressBarでProgressBarを示すダイアログがポップアップ表示されます。ダイアログには、「キャンセル」ボタンが含まれています。このボタンを押すと、タスクの実行が取り消されます。しかし、タスクを再開すると(最後のインポートをキャンセルした後にファイルを再度インポートしようとすると)、タスクが開始されるだけでなく、最後のタスクで連続性が取り消されます。私はこれがファイルの出力に何らかの影響を与えるかどうかはわかりませんが、それでも私は知りたいと思います:タスクを完全に終了または終了できますか?JavaFX - タスクを完全に終了または終了できますか?

Task<Void> task = new Task<Void>() {    
      @Override 
      protected Void call() throws Exception { 
       if(chat.getName().contains("KakaoTalk_")) { 
        String s = ""; 
        String gesamt = ""; 
        double laenge = 0; 
        try(BufferedReader brCount = new BufferedReader(new FileReader(chat))) { 
         while((s=brCount.readLine())!=null) { 
          laenge++; 
          if(isCancelled()) { 
           break; 
          } 
         } 
        } catch (IOException e) { 
         System.out.println("Fehler beim zählen"); 
        } 
        double berechneLaenge = 0; 
        double berechneProzentLaenge = 0; 
        try(BufferedReader brCount = new BufferedReader(new FileReader(chat))) { 
         while((s=brCount.readLine())!=null) { 
          if(isCancelled()) { 
           break; 
          } 
          berechneLaenge++; 
          berechneProzentLaenge = (berechneLaenge/laenge)*100; 
          prozentOderSo.set(String.valueOf((int)berechneProzentLaenge)); 
         } 
        } catch (IOException e) { 
         System.out.println("Fehler beim zählen"); 
        } 
        double momentanErreicht = 0; 
        try(BufferedReader br = new BufferedReader(new FileReader(chat))) { 
         while((s=br.readLine())!=null) { 
          momentanErreicht++; 
          updateProgress(momentanErreicht, laenge); 
          int p = (int)((momentanErreicht/laenge)*100); 
          prozentImported.set(p); 
          s = s.replace("ß", "ß"); 
          s = s.replace("ö", "ö"); 
          s = s.replace("ü", "ü"); 
          s = s.replace("ä", "ä"); 
          s = s.replace("Ä", "Ä"); 
          s = s.replace("Ãœ", "Ü"); 
          s = s.replace("Ö", "Ö"); 
          gesamt += s+"\n"; 
         } 
        } catch (FileNotFoundException e1) { 
         System.out.println("File not found"); 
        } catch (IOException e2) { 
         System.out.println("IOException"); 
        } 
        mp.eingabeSetText(gesamt); 
        setChat(mp.eingabeGetText()); 
        getChat(); 
       } else mp.mhNichtPassendesFile(); 
       return null; 
      } 
     }; 
     mp.progressP().bind(task.progressProperty()); 
     mp.startFortschrittDialog(); 
     task.setOnFailed(mteh); 
     Thread th = new Thread(task); 
     th.setDaemon(true); 
     this.task = task; 
     th.start(); 
} 

答えて

0

タスクを終了することはできません。キャンセルすることができるのは、方法isCancelled()で取り消された場合にのみ、このタスクをチェックインすることができます。

私は文書を引用してみましょう:

isCancelled(のチェック

)ループ本体には、そうでない場合は、開発者がタスクを取り消すことができる、非常に重要ですが、タスクが進行し、帰国の両方を実行し、更新を継続します呼び出しメソッドの終わりから間違った結果。タスクの正しい実装は、常にキャンセルをチェックします。

+0

説明してくれてありがとうございますが、タスクが継続して実行されないようにするにはどうすればよいですか?私は現在のコードを質問に入れます。 – Korlimann

+0

私は、 'isAlive()'メソッドを使ってあなたのスレッドの状態を確認することができます。 –

+0

@Korlimann最初の引用文がありますか? "ループ本体でisCancelled()をチェックすることは重要です。そうしないと、開発者はタスクを取り消すことができますが、タスクは引き続き実行されます..."ループでisCancelled()をチェックします。 – VGR

関連する問題