IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDT/SwingWorker Java Discussion :

Freeze de l'application


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Points : 843
    Points
    843
    Par défaut Freeze de l'application
    Bonjour à tous !

    Je développe un bon gros client lourd sous Swing et il arrive de temps en temps (souvent ?) que l'application freeze complètement et que le seul moyen pour l'éteindre soit de killer la JVM.

    J'essaie pourtant d'être prudent avec l'EDT mais ce n'est pas toujours simple.

    Est-il possible que ces freezes soient liés à autre chose que l'EDT ? Sachant qu'en général l'application freeze lorsqu'on clique sur un bouton censé ouvrir une nouvelle fenêtre.

    L'application ne se fige pas forcément à chaque fois. Un même bouton ne fera planter l'application qu'au bout de plusieurs minutes ou heures et c'est quelque chose que j'ai du mal à comprendre.

    Comment débugger efficacement ces plantages, histoire de voir à quels endroits un invokeLater() serait utile par exemple ?

    Je vous remercie d'avance pour votre aide

  2. #2
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par julien.1486 Voir le message
    J'essaie pourtant d'être prudent avec l'EDT mais ce n'est pas toujours simple.
    Essaie de faire tourner en arrière plan uniquement les calculs, accès fichiers, constructions de listes, etc. sans jamais toucher un truc de la surface graphique. Et seulement après, quand ce travail d'arrière plan est terminé, tu affiche l'interface graphique sur l'EDT. En d'autres mots, essaie de séparer complètement les deux choses: calculs (doInBackground) et graphiques (done).

    Utilise le "SwingWorker" et essaie d'éviter les "invokeLater".

  3. #3
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Points : 843
    Points
    843
    Par défaut
    Citation Envoyé par uhrand Voir le message
    Utilise le "SwingWorker" et essaie d'éviter les "invokeLater".
    Parce que le "invokeLater" est symptomatique d'une "mauvaise" conception ?

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par julien.1486 Voir le message
    Parce que le "invokeLater" est symptomatique d'une "mauvaise" conception ?
    Non, pas du tout.

    C'est juste que le SwingWorker englobe toute la gestion des invokeLater, donc te simplifie le travail .
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  5. #5
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par julien.1486 Voir le message
    Parce que le "invokeLater" est symptomatique d'une "mauvaise" conception ?
    SwingWorker est généralement recommandé pour les travaux en arrière plan. "invokeLater" a tendance à compliquer terriblement les choses jusqu'au point de ne plus pouvoir s'en sortir. De ce point de vue c'est peut-être (mais pas toujours!) symptomatique d'une mauvaise conception.

  6. #6
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Points : 843
    Points
    843
    Par défaut
    J'ai trouvé quelques bouts de codes intéressant sur cet article.

    On y trouve une classe CheckThreadViolationRepaintManager qui est un RepaintManager détectant les violations de l'EDT.

    Il présente aussi une autre méthode en se basant sur l'AOP.

    Je vous met le code de cette classe :

    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
    public class CheckThreadViolationRepaintManager extends RepaintManager {
        // it is recommended to pass the complete check  
        private boolean completeCheck = true;
     
        public boolean isCompleteCheck() {
            return completeCheck;
        }
     
        public void setCompleteCheck(boolean completeCheck) {
            this.completeCheck = completeCheck;
        }
     
        public synchronized void addInvalidComponent(JComponent component) {
            checkThreadViolations(component);
            super.addInvalidComponent(component);
        }
     
        public void addDirtyRegion(JComponent component, int x, int y, int w, int h) {
            checkThreadViolations(component);
            super.addDirtyRegion(component, x, y, w, h);
        }
     
        private void checkThreadViolations(JComponent c) {
            if (!SwingUtilities.isEventDispatchThread() && (completeCheck || c.isShowing())) {
                Exception exception = new Exception();
                boolean repaint = false;
                boolean fromSwing = false;
                StackTraceElement[] stackTrace = exception.getStackTrace();
                for (StackTraceElement st : stackTrace) {
                    if (repaint && st.getClassName().startsWith("javax.swing.")) {
                        fromSwing = true;
                    }
                    if ("repaint".equals(st.getMethodName())) {
                        repaint = true;
                    }
                }
                if (repaint && !fromSwing) {
                    //no problems here, since repaint() is thread safe
                    return;
                }
                exception.printStackTrace();
            }
        }
    }
    Il suffit ensuite au démarrage de l'application de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager());
    L'auteur présente également une autre solution au cas où vous utiliseriez déjà un RepaintManager.

    Merci pour vos réponses et votre aide. J'espère un jour venir à bout de tous ces freezes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lancer form qui freeze l'application
    Par alacaraibe dans le forum Windows Forms
    Réponses: 2
    Dernier message: 15/12/2009, 17h17
  2. [Memset] Freeze de l'application
    Par Bleys dans le forum Bibliothèque standard
    Réponses: 22
    Dernier message: 02/09/2009, 12h10
  3. Mon application "FREEZE"
    Par donaldz dans le forum Langage
    Réponses: 2
    Dernier message: 08/04/2009, 22h27
  4. "Freeze" d'une application Java/SWING sur fedora 10
    Par logdrop dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 27/03/2009, 16h26
  5. Freeze de l'application
    Par thierry007 dans le forum VB.NET
    Réponses: 6
    Dernier message: 09/10/2008, 12h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo