Bonjour à tous ,
Je suis actuellement en train de développer une interface graphique composée entre autre d'une tableView , d'un textArea, d'un barChart ainsi que d'un panel contenant plusieurs progressIndicator. J’exécute en tache de fond une certains nombre de traitement sur des données que j'ai récupéré auparavant afin ensuite de pouvoir afficher les résultats sur l'interface.
Pour chacune des données récupérée , j’exécute 6 taches .
Chacune de ces taches est exécutée via une classe CustomTask que j'ai crée et qui hérite de la classe Task. Ces taches vont exécuter des lignes de commande via un Processbuilder ( commande clearCase, execution de . bat , execution de . exe) .
Pour chaque donnée les taches doivent être faite de manière séquentielle . Les données doivent aussi être traité l'une après l'autre .
Voici la fonction me permettant de lancer le traitement de mes données :
Comme vous pouvez le voir j’attends toujours la fin d'une tache avant d'en exécuter une autre . La méthode launchTasks est appelé récursivement afin de traiter la suite des données . A chaque appel la méthode traite une donnée choisie dans une liste d'objets par l’intermédiaire d'un conteur ( j'ai retiré cette portion de code car il s'agit juste de récupération de données pour pouvoir mettre en place les commande avant le lancement de la première tache) .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 public void launchTasks() { final CustomTask task1= new CustomTask(cmdPrompt,cmd,Namescript); final CustomTask task2= new CustomTask(cmdPrompt,cmd2,Namescript); final CustomTask task3= new CustomTask(cmdPrompt,cmd3,Namescript); final CustomTask task4= new CustomTask(cmdPrompt,cmd4,Namescript); final CustomTask task5= new CustomTask(cmdPrompt,cmd5,Namescript); final CustomTask task6= new CustomTask(cmdPrompt,cmd6,Namescript); pi1.progressProperty().bind(task3.progressProperty()); pi2.progressProperty().bind(task4.progressProperty()); pi3.progressProperty().bind(task5.progressProperty()); pi4.progressProperty().bind(task6.progressProperty()); new Thread(task1).start(); task1.setOnSucceeded(new EventHandler<WorkerStateEvent>() { @Override public void handle(WorkerStateEvent t) { new Thread(task2).start(); } }); task2.setOnSucceeded(new EventHandler<WorkerStateEvent>() { @Override public void handle(WorkerStateEvent t) { new Thread(task3).start(); } }); task3.setOnSucceeded(new EventHandler<WorkerStateEvent>() { @Override public void handle(WorkerStateEvent t) { new Thread(task4).start(); } }); task4.setOnSucceeded(new EventHandler<WorkerStateEvent>() { @Override public void handle(WorkerStateEvent t) { new Thread(task5).start(); } }); task5.setOnSucceeded(new EventHandler<WorkerStateEvent>() { @Override public void handle(WorkerStateEvent t) { new Thread(task6).start(); } }); task6.setOnSucceeded(new EventHandler<WorkerStateEvent>() { @Override public void handle(WorkerStateEvent t) { //mise à jour de la tabelView // on check si il y encore des données a traiter // si oui on rappelle la fonction launchTasks(), pour la prochaine donnée // sinon on a fini } }); }
Voici ma classe CutomTask qui me permet d’exécuter ma ligne de commande puis de rediriger le flux vers le textArea de mon interface :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 public class CustomTask extends Task { private String contenu="" ; private TextArea cmdPrompt; private String [] myCmd; private String scriptName; public CustomTask(TextArea cmdProm, String[] cmd, String name) { this.cmdPrompt=cmdProm; this.myCmd=cmd; this.scriptName=name; messageProperty().addListener(new ChangeListener<String>(){ @Override public void changed(ObservableValue<? extends String> arg0, String arg1, String arg2) { cmdPrompt.appendText(contenu); }}); } @Override protected Object call() { try { TestExecution.probuilder.command(myCmd); Process p=TestExecution.probuilder.start(); BufferedReader input= new BufferedReader(newInputStreamReader(p.getInputStream())); String line; String tmpon=""; tmpon=("\n "); while ((line = input.readLine()) != null) { tmpon = tmpon+"\n"+line; System.out.println(line); } contenu=tmpon; input.close(); p.waitFor(); } catch (Exception e) { System.out.println("Task Exception"); } updateMessage(contenu); updateProgress(1, 1); return null; } }
J'arrive a traiter l'ensemble de mes données mais après un certains nombre de lancements (~5) de la méthode launchTasks() , l'interface commence à très sévèrement ramer . Il devient très difficile de naviguer au niveau de la tableView , les progressIndicator sont aussi très ralenti . Même chose pour le textArea . L'interface rame vraiment beaucoup .Même après l’exécution de tous les taches de fonds, l'interface reste dans le même étant. Ce n'est pas un problème de thread , étant donnée que je fais en sorte de lancer une tache , un fois la précédente terminée.
J'ai pensé que c'était la récursivité qui entrainait mon problème mais après avoir essayé sans , le problème persiste.
Merci d'avance .
Partager