Bonsoir,
En executant mon Aplication sur le "long terme", j'ai constaté un soucis que je ne parvient pas à résoudre simplement.
En effet, mon apllication swing fonctionne sans ce soucis sur de très longue durée, hors sa version javaFX plante après une longue durée passée sous le mode extinction de l'ecran de windows 10. Environ apres 10 heure il me semble.
Seulle la partie graphique plante.
Le contexte est le suivant :
Mon application Javafx lance l'interface.
Je lance le programme qui effectue des actions et écrit certaines étapes dans la console java.
(Le flux de la console est redirigée vers ma console javafx perso, ou je met le texte en forme (colorisation etc...)
Je vais dormir.
Je me réveille, je réveille l'ordi, je clique sur la fenêtre de mon appli, et la console se met à jour graphiquement.
Je pars bosser.
Je revient, je clique sur mon appli, et la elle freeze.
D'apres ce que j'ai compris, quand l’écran est éteint, javaFX ne met pas jour l'affichage et les "runlaters" s'accumulent tel qu'il est recommandé de ne pas le faire dans la doc
applications should avoid flooding JavaFX with too many pending Runnables. Otherwise, the application may become unresponsive. Applications are encouraged to batch up multiple operations into fewer runLater calls.
Le soucis c'est que je ne sais pas comment corriger le soucis, j'ai essayé pas mal de choses, mais sans succès...
C'est une console, elle doit ecrire... et écran allumé, point de soucis aucun...
Mon ordi est assez vieu, corei7 920 de 2008-2009, la carte graphique est une nvidia 285gti. Peut être un problème de la carte graphique ou autre ? Elle n'est pas certifié par oracle pour jafafx.
Et pour info, j'ai intégré la biblio RichTextFX : https://github.com/TomasMikula/RichTextFX
En essayant de comprendre, j'ai refais un mini appli qui reproduit mon cas, de manière très très épurée :
En gros je spam une console et laisse l'ecran s'eteindre. quand je revient après une certaine durée... Ca freeze.
Main
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 package application; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextArea; import javafx.scene.layout.BorderPane; import javafx.scene.paint.Color; import org.fxmisc.richtext.StyleClassedTextArea; public class Main extends Application { StyleClassedTextArea zoneText = new StyleClassedTextArea(); Ecrire e = new Ecrire(this); unThread t = new unThread(); int i = 0; @Override public void start(Stage primaryStage) { e.setZoneText(zoneText); t.setEcrire(e); try { BorderPane pane = new BorderPane(); Button btn = new Button(); btn.setMinHeight(25); btn.setMinWidth(25); btn.setText("start"); btn.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent event) { if (i == 0) { i = 1; t.start(); } else {t.stop();} } }); pane.setTop(btn); pane.setCenter(zoneText); zoneText.setStyle( "-fx-background-color: blue" ); Scene scene = new Scene(pane,400,400); primaryStage.setScene(scene); primaryStage.show(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { launch(args); } }
Module appelant les runlater:
Thread transmettant au module ci dessus les données à afficher dans la console :
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 package application; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import org.fxmisc.richtext.StyleClassedTextArea; public class Ecrire { StyleClassedTextArea zoneText; Main main; //contructeur public Ecrire(Main main){ this.main = main; try { flux();} catch (IOException e) {e.printStackTrace(); } } public void ecrire(String phrase){ javafx.application.Platform.runLater( () ->{ main.zoneText.appendText(phrase); }); } public void flux() throws IOException{ StringBuilder sb = new StringBuilder(); System.setOut(new PrintStream(new OutputStream() { @Override public void write(int b) throws IOException { sb.append((char)b); if (b == '\n') { //b == ' ' || b == '\t' || b == '\r' || ecrire(sb.toString()); sb.setLength(0); } } })); } public void setZoneText(StyleClassedTextArea zoneText){ this.zoneText = zoneText; } }
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 package application; import org.fxmisc.richtext.StyleClassedTextArea; public class unThread extends Thread { Ecrire ecrire; int a = 0; public void run() { // ecrire. while (true){ a++; int i = 0; while(i < 500 ){ System.out.println("send" + a +" " + i); //ecrire.ecrire("send"+ a + i ); i++; } try { Thread.sleep(5000); } catch (InterruptedException e) {e.printStackTrace();} } } public void setEcrire(Ecrire ecrire) { this.ecrire = ecrire; } }
Avez vous des idées ?
La redirection de la console ?
Partager