FLux de la console - Java - Programmation
Marsh Posté le 26-09-2005 à 09:44:52
Il suffit de mettre ton propre objet de type PrintStream dans les variables System.out et System.err afin de rediriger les flux vers ton GUI.
Marsh Posté le 26-09-2005 à 09:46:29
Oui ok, mais moi je veux les fluxs vers la console ET vers la GUI !!!
Si tu veux c'est un projet qui fait environ 2000 source .java donc je ne peux pas tout y modifier !!!
Marsh Posté le 26-09-2005 à 13:20:39
Rien ne t'empeche de renvoyer le flux vers la console et la GUI. Il faudra juste faire attention à ne pas boucler indéfiniment lorsque tu vas renvoyer et recevoir les message de la console.
Et puis tu n'as pas à modifier tes 2000 sources, il suffit de modifier les variables System.out et System.err au début de ton programme.
Marsh Posté le 26-09-2005 à 14:15:54
Tu créé une classe héritant de java.io.PrintStream (ou plus simple de java.io.OutputStream et tu utilises le constructeur aproprié de PrintStream) et tu surcharges les méthodes dont tu as besoin (les méthodes write).
Dans ces méthodes tu fait ce que tu veux avec les données que tu recois, dans ton cas tu peut les renvoyer vers ta GUI.
Ensuite tu créé 2 instances de cette classe que tu passes en paramètre des méthodes setErr() et setOut() de la class java.lang.System.
Et voila, maintenant tu as intercepté tout tes messages partant normalement vers la console.
Marsh Posté le 26-09-2005 à 14:19:45
ça je l'avais déjà fait. Tous mes messages étaient bien intercepté pour aller vers la GUI mais je veux en plus, que ces messages aillent tout de même vers la console... Je veux un flux qui se dédouble pour aller ET vers la CONSOLE ET vers la GUI...
Marsh Posté le 26-09-2005 à 14:32:15
Bon alors dans la classe tu as créé tu mets en paramètre du constructeur le flux que tu vas remplacer et tu le sauvegarde dans un coin. Ensuite a chaque fois que tu as un appel à une méthode write tu rappelle ton flux sauvegardé et ton appel au GUI.
Par exemple:
Code :
|
Et au début de ton prog:
Code :
|
Marsh Posté le 26-09-2005 à 14:41:51
perso je pense que c'est mal de changer les System.out et System.err
mieux vaut utiliser une classe qui dispatch les stream en amont de System.out et System.err qu'en aval.
genre
Code :
|
de la sorte on altère pas le comportement de System.out et System.err
cela dit le code ci-dessus n'est pas super joli non plus, c'est juste pour donner une idée.
Marsh Posté le 27-09-2005 à 14:34:02
ET si il me faut un affichage en parallele des deux cotés ? Car avec vos méthodes l'affichage se fait les uns aprés les autres...
Marsh Posté le 27-09-2005 à 14:43:40
Aves la méthode nerisson qui utilise l'objet OutputInterceptor, l'affichage se fait d'abord sur la console puis sur la GUI. Comment faire pour que ça s'affiche en paralléle, en même temps des deux côtés ??
Marsh Posté le 27-09-2005 à 14:46:11
ben la avec les 2 solutions proposées, ca se fait quasi en meme temps, a un tableau de bits près
tu as besoin d'une simultanéité à la nanoseconde près ?
Marsh Posté le 27-09-2005 à 14:48:20
Bah nan avec la premiére méthode ça m'affiche d'abord sur la console tout puis aprés la gui...
Marsh Posté le 27-09-2005 à 14:52:59
Et même si je mets la gui avant la console, il va d'abord m'afficher un gros texte sur la console puis seulement aprés sur la gui...
Marsh Posté le 27-09-2005 à 14:54:03
oui et non
effectivement c'est pas EXACTEMENT en meme temps, mais je doute que tu arrives a garantir que deux choses se passent en meme temps....
c'est quoi en meme temps pour toi ? tu as besoin que ce soit en meme temps à une nanoseconde pres, ou est-ce que une milliseconde de difference ca te suffit ?
Marsh Posté le 27-09-2005 à 14:56:13
ben le millieme ça me suffit, même un peu plus, car là il m'affiche pendant environ 5 secondes dans ma console tout le baratin puis seulement aprés, il m'afiche la même chose dans la gui.
Marsh Posté le 27-09-2005 à 15:00:37
ca ca vient de ton utilisation des streams, faut pas lui envoyer 3Go de données en meme temps. ensuite, tu peux essayer d'utiliser des BufferedOutputStream aussi.
Marsh Posté le 27-09-2005 à 15:01:51
COmment je peux faire pour régler la taille des données envoyées ?
Marsh Posté le 27-09-2005 à 15:03:45
comment tu fais actuellement ?
comment tu récupères les données ?
comment tu les transmets ?
Marsh Posté le 27-09-2005 à 15:09:11
Code :
|
Et j'ai exactement la même chose pour la sortie d'erreur...
Ensuite je les apelle de cette maniére :
Code :
|
Voilà...
Marsh Posté le 27-09-2005 à 15:16:58
Comment je fais actuellement : je crée deux nouvelles objets. UN pour la sortie normal et un autre pour la sorti d'erreur. Chaque objet contient deux outputStream : le nouveau et l'ancien(celui par défaut).
Ensuite comment je récupére les données, c'est comme d'habitude, grâce à un system.out.println() qui m'envoie directement sur ma méthode write( byte b[], int off, int len). Ensuite je les transmet et à la gui puis à la console (car j'ai gardé l'ancien PrintStream).
Marsh Posté le 27-09-2005 à 15:32:05
et tu envoies quoi comme données ? tu fais un System.out.println( une chaine de caractère de 3Go ) ?
est-ce qu'il y aurait pas moyen d'envoyer ces données par morceaux plutot qu'un gros truc ?
Marsh Posté le 27-09-2005 à 16:04:29
Non je n'envoie pas de gros morceau. En fait j'utilise des scripts groovy que je balance et j'affiche le résultat du script dans la gui et dans la console. Et les system.out.println se font progressivement avec 1 ligne maxi à chaque fois.
Marsh Posté le 27-09-2005 à 16:17:29
bah c'est pas normal, donc a mon avis c'est ton addTextConsole qui deconne et ta gui ne se mets pas bien a jour...
Marsh Posté le 27-09-2005 à 16:29:22
Je viens d'essayer mais ça ne marche pas. Fait une boucle de 1 à 100 qui affiche une String dans un composant graphique sans afficher sur la console. Moi il me charge les 100 String puis il les affiche dans le composant (en l'occurence pour moi un JTextPane et un Document)
Marsh Posté le 27-09-2005 à 16:34:51
souk a écrit : bah c'est pas normal, donc a mon avis c'est ton addTextConsole qui deconne et ta gui ne se mets pas bien a jour... |
+1
Marsh Posté le 27-09-2005 à 16:41:36
Non ce n'est pas ça car j'ai fait un repaint juste derriére l'ajout de texte à mon document.
Il ne peut pas y avoir un probleme de Thread ? Car quand j'appuie sur mon bouton de la gui pour lancer le script,
le bouton reste bloqué, ainsi que la GUI, alors que pendant ce temps tout est écrit sur la console. Une fois que sur la console c'est fini alors le message s'affiche sur la gui.
Marsh Posté le 27-09-2005 à 17:09:25
brasseldX a écrit : Non ce n'est pas ça car j'ai fait un repaint juste derriére l'ajout de texte à mon document. |
ben tu n'utilises pas swing comme il faut, tu fais tout ton boulot dans l'event dispatching thread de swing, du coup repaint ou pas repaint, ta gui ne se repaindra pas
fais des recherches sur les methodes invokeLater et tu peux aussi trouver des trucs en cherchant SwingWorker sur le site de Sun.
Marsh Posté le 28-09-2005 à 09:11:36
souk a écrit : ben tu n'utilises pas swing comme il faut, tu fais tout ton boulot dans l'event dispatching thread de swing, du coup repaint ou pas repaint, ta gui ne se repaindra pas |
re +1
Marsh Posté le 28-09-2005 à 10:43:18
ok mais je ne vois pas du tout comment utiliser ça pour gérer les fluxs en paralléle. Car je ne peux pas passé de parametre avec invokeLater ou SwingWorker.
De plus, le SwingWorker est plus adapté.
Mais mon probléme c'est le passage de paramétre car je veux faire ça :
Code :
|
Marsh Posté le 26-09-2005 à 09:27:22
Tout d'abord bonjour,
Je voudrai savoir si il est possible de récupérer le flux qui arrive dans la console pour le récupérer. Car en fait je dois dvelopper une appli qui affiche la même chose dans la console ET dans une GUI.
Je ne sais pas trop comment faire...
Merci d'avance de votre réponse...