Gestion de l'affichage de jframe dans un programme lourd [Résolu]

Hermios 265 Messages postés dimanche 14 avril 2013Date d'inscription 23 mai 2014 Dernière intervention - 21 mai 2010 à 14:13 - Dernière réponse : Hermios 265 Messages postés dimanche 14 avril 2013Date d'inscription 23 mai 2014 Dernière intervention
- 1 juin 2010 à 13:03
Bonjour à tous,
Mon problème est dû à mon programme qui est assez lourd :
Je cherche notamment à afficher une barre de progression via un thread. Or lorsque celle-ci apparait, elle n'affiche que le contenu qui se trouve derrière (En gros, seul le cadre s'affiche, mais le contenu est vide)
J'ai le même problème avec une fenêtre toute simple (sans thread) contenant un seul bouton. Pour le test, j'ai créé un programme simplifié qui affiche également cette fenêtre en faisant d'autres calculs, et là, il n'y a aucun problème. Donc, en gros, comment faire passer cette fenêtre - via un thread ou non - en priorité? (Ou alors une meilleur idée?)

Merci beaucoup de votre aide (Et désolé si je suis pas clair, hésitez pas à me le dire, j'essaierai d'être plus explicite :) ).

@+. Hermios
Afficher la suite 

6 réponses

Répondre au sujet
Hermios 265 Messages postés dimanche 14 avril 2013Date d'inscription 23 mai 2014 Dernière intervention - 1 juin 2010 à 13:03
+3
Utile
Bon, j'ai finalement trouvé le problème : Je lancai une JFrame, puis en lancait une autre à partir de la première, qui donc la bloquait. Maintenant, une classe supérieur lance chaque Frame l'une après l'autre, et tout fonctionne.

En tout cas, merci de ton aide, ca m'a permis de comprendre le principe des threads et comment résoudre mon problème :)


@+. Hermios
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Hermios
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 21 mai 2010 à 14:38
0
Utile
Salut,

Il te faut utiliser le Thread d'affichage de swing pour tout ce qui est affichage de fenêtre, de composants ou autre, sinon, forcément, ton thread principal est totalement occupé lors de traîtement lourd, et tu obtiens ce genre de problème graphique.

je te laisse aller voir ceci.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Commenter la réponse de cs_DARKSIDIOUS
Hermios 265 Messages postés dimanche 14 avril 2013Date d'inscription 23 mai 2014 Dernière intervention - 21 mai 2010 à 15:09
0
Utile
Salut,
D'abord, merci pour la réponse bien rapide :)
Ensuite, je ne comprend pas bien : Prenons le cas de ma barre de progression :
J'ai d'abord un GUI qui s'ouvre, je remplis mes paramètres, puis je lance l'exécution d'un prgm en fonction desdits paramètres. L'une des premières actions du nouveau prgrm est de fermer ce premier GUI (une JFrame), puis, plus tard, il lance la barre de progression sous la forme : threadProgression.run().
J'ai essayé la méthode invokeLaterAndWake(threadProgression), mais ca le fait planter.
Avec invokeLater, il plante pas, mais pas de changements.
J#ai même essayé en changeant la priorité de mon thread (setPriority(1)), en le définissant comme un nouveau daemon, j'ai essayé le repaint, ca ne change rien. Mon cadre s'affiche, vide, jusqu'à ce que le programme principale lui laisse un peu de travail.
Désolé de te demander ca aussi abruptement, mais tu pourrais me fournir un bout de code pour que je comprenne? Merci beaucoup

@+. Hermios
Commenter la réponse de Hermios
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 21 mai 2010 à 15:17
0
Utile
Salut,

Tu as essayé avec les bouts de code du lien que je t'ai donné afin de bien comprendre toutes les notions ? Ca vaut le coup de perdre une heure ou deux pour comprendre tout ce qui y est dit, crois-moi.

Le principe avec swing? c'est de ne laisser dans le thread d'affichage (EDT) que les routines de tracé, et de lancer tout les autres traîtement (instanciation, connexion à une base, chargement d'une image, etc. etc., bref, le plus gros du boulot) dans un autre thread lancé à part, ainsi, l'EDT pourra faire ce qu'il doit faire (le rafraichissement de l'interface) pendant que ton programme fait ce qu'il est censé faire (travail sur les données).

<modetroll>
Si tu ne fais pas comme cà, tu auras l'impression que ton programme rame, que java c'est lent, et que de toute façon, un langage interprêté n'est pas fait pour du travail lourd. SWING a de très bonne performance, mais encore faut-il savoir l'utiliser et ne surtout pas utiliser d'éditeur graphique du type de celui de netbeans qui produise un code si lamentable qu'il est tout juste fait pour être jeter à la poubelle.
</modetroll>
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Commenter la réponse de cs_DARKSIDIOUS
Hermios 265 Messages postés dimanche 14 avril 2013Date d'inscription 23 mai 2014 Dernière intervention - 21 mai 2010 à 15:59
0
Utile
Ok, je vais regarder ca la semaine prochaine (Là, plus le temps, trop de trucs m'arrivent en même temps!)
Je te tiens au courant, merci beaucoup de ton aide


@+. Hermios
Commenter la réponse de Hermios
Hermios 265 Messages postés dimanche 14 avril 2013Date d'inscription 23 mai 2014 Dernière intervention - 31 mai 2010 à 17:28
0
Utile
Salut Darksidious,
Alors j'ai essayé, mais j'y arrive pas.
D'abord, une remise dans le contexte :
J'ai un swing barre de progression, et un programme d'analyse. Le programme d'analyse fonctionne par étapes, et à chaque étape, la barre est updatée (Nouvelle valeur de la barre, nouveau texte dans la barre).
Pour simplifier, je lance l'analyse dans un nouveau thread.
Voici tout ce que je'ai pu essayer :
- Je lance en premier mon thread "Barre de progression", puis mon programme d'analyse-> Il initialise correctement ma barre, mais ne l'update pas
- Je lance l'analyse avecun invokelater, toujours après avoir lancé la barre.
->Idem
- Ma barre de progression est une frame, qui contient un runnable public pour l'update. J'initialise la barre de progression, puis le thread d'analyse, qui, au moment d'updater la barre, lance le runnable au format invokeandwait (Donc normalement, ca stoppe le thread courant, donc le thread d'analyse, et lance le thread secondaire)-> Là, c'est le drame, il plante de partout, me disant :
"Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread
at java.awt.EventQueue.invokeAndWait(Unknown Source)
at javax.swing.SwingUtilities.invokeAndWait(Unknown Source)"

HELP!!! Merci beaucoup :)

@+. Hermios
Commenter la réponse de Hermios

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.