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

AWT/Swing Java Discussion :

Erreur lors de l'utilisation de TableSorter.java


Sujet :

AWT/Swing Java

  1. #41
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Citation Envoyé par Bloodscalp
    J'ai un peu de peine avec la synchronisation. J'ajoute mes enregistrements dans un model, j'ai donc synchronisé mon model.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                Thread RechercherUtilisateurs = new Thread() {
                    @Override public void run() {
                        synchronized(dtmModel) {
                            for(int i = 0; i<2000; i++){
                            dtmModel.addRow(new String[] {i+"", "texte", "texte", "texte"});
                            }
                        }
     
                    }
                };
    Est-ce correct ?

    Et pourquoi faut-il synchroniser ? J'ai lu que la synchronistation était utilie uniquement si plusieurs threads vont faire appel à la méthode, or ce n'est pas mon cas...
    Il y a bien plusieurs threads qui accedent à dtmModel.
    Le thread de recherche que tu lances juste au dessus et juste après il y a le main thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableSorter tbsSorter = new TableSorter(dtmModel);

    J'ai réussi à reproduire l'erreur (Si je ne l'avais pas, c'est parce que ma machine va trop vite apparemment )
    J'ai mis un Thread.sleep(1) dans le for du dessus, histoire que la recherche prenne plus de temps.

    Donc voila l'impression que j'ai (qui n'est qu'une impression)
    Le thread de recherche modifie dtmModel pendant que le main thread y accede (par le biais de la classe TableSorter et de ses différentes méthodes qui récupèrent le nombre de lignes, les valeurs etc)

    J'ai résolu chez moi en synchronisant les endroit ou le truc était accédé.
    Autrement dit dans la classe Main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                // Créer un nouveau threas ou s'éxecuteras la recherche
                Thread RechercherUtilisateurs = new Thread() {
                    @Override public void run() {
                        for(int i = 0; i<2000; i++){
    						synchronized (dtmModel) {
    	                        dtmModel.addRow(new String[] {i+"", "texte", "texte", "texte"});
    						}
     
                        }
                    }
                };
    Et dans TableSorter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public Object getValueAt(int row, int column) {
        	synchronized (tableModel){
                return tableModel.getValueAt(modelIndex(row), column);
        	}
        }
    et
    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
        private Row[] getViewToModel() {
        	synchronized (tableModel){
        		if (viewToModel == null) {
        			int tableModelRowCount = tableModel.getRowCount();
        			viewToModel = new Row[tableModelRowCount];
        			for (int row = 0; row < tableModelRowCount; row++) {
        				viewToModel[row] = new Row(row);
        			}
     
        			if (isSorting()) {
        				Arrays.sort(viewToModel);
        			}
        		}
        	}
            return viewToModel;
        }

    Y a d'autres endroits dans TableSorter ou c'est accédé, mais apparemment pas dans cet exemple alors je n'ai rien touché d'autre.

    En résumé bien faire attention aux endroit ou un objet peut-être accédé dés qu'on lance un thread.

    Si je n'avais pas l'exception chez moi c'est que la recherche se finissait avant l'utilisation de TableSorter.

    Une autre solution serait de laisser la recherche se terminer avant de faire la suite (et donc de ne pas faire un autre thread) si elle ne prend pas trop de temps.

    Voila, j'espère que cette fois est la bonne.
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  2. #42
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Points : 120
    Points
    120
    Par défaut
    Oui.... et non.

    J'ai apporté les modification que tu m'a décrite au dessus. Ça fonctionne, mais seulement pour le code "test".

    Quand je lance mon application, j'ai toujours les erreurs. Pourtant je n'ai que du texte dans mon tableau. J'ai essayé de synchroniser d'autres éléments qui modifient le model dans la classe TableSorter, mais ça ne donne rien pour l'instant.

    Ma recherche dure environ 3-4 secondes, mais la durée pourrait venir s'allonger au fil du temps.
    Il y a 10 types de personnes, celles qui connaissent le binaire, et les autres...

  3. #43
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Assure-toi que tous les endroits ou l'objet tablemodel est accédé sont synchro.

    A part ça, je ne peux vraiment plus rien dire de plus.

    Et sinon, mettre une petite musique d'attente pendant la recherche ça va pas ?

    EDIT : Plus sérieusement, il y a peut-être une possibilité d'optimiser la requête qui fait la recherche pour rabaisser le temps et laisser quand même tomber cette histoire de thread si c'est pas résolu ?
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  4. #44
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Points : 120
    Points
    120
    Par défaut
    N'y arrivant pas avec les synchro, j'ai mis mon appel de TableSorter dans le thread de recherche. Comme ça au moins, ça n'arriveras jamais en même temps.

    C'est peut-être un peu , mais ca fonctionne

    En tout cas, merci bcp Satch, je n'y serait jamais arrivé sans toi, et sans les autres aussi ^^
    Il y a 10 types de personnes, celles qui connaissent le binaire, et les autres...

  5. #45
    Membre du Club Avatar de Frac10
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 43
    Points
    43
    Par défaut
    Heu Bloodscalp, tu veux que je mette résolu ?

    Parce que moi en fait çà ne me le fait plus (ou alors 1 fois sur 100 comme le disait Satch), et si jamais je revois cette erreur trop souvent, j'essaierai d'appliquer les méthodes que tu as utilisées.

    Sinon un grand merci à tous ceux qui ont cherché à aider !

  6. #46
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Points : 120
    Points
    120
    Par défaut
    Pour moi c'est résolu.

    Je pense que ton Pc est assez rapide pour faire tourne l'appli sans qu'il y aie de conflit. Essaie de lancer la compression d'un gros fichier et de lancer ton application en même temps, pour voir si ça cafouille.

    Enfin si t'est le seul à l'utiliser, ça ne devrait pas poser de problèmes, mais si tu le passe a qqun d'autre, il risque de ne pas comprendre.
    Il y a 10 types de personnes, celles qui connaissent le binaire, et les autres...

  7. #47
    Membre du Club Avatar de Frac10
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 43
    Points
    43
    Par défaut
    Ok, j'essaierai çà quand j'aurai éliminé les autres problèmes...

    Sinon merci encore et je mets donc résolu.

  8. #48
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Citation Envoyé par broumbroum
    AWT-EVENTQUEUE ne renvoie que des erreurs de Threads AWT donc c'est surement une erreur de synchronisation de méthode. lorsque tu modifies le tableau veille à la synchronisation de celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // mot-clé synchronized sur le tableau
    modifierCellule(int i0, int i1) {
    synchronized(tonTableau) { tonTableau.setCell(i0,i1, "valeur modifiée"); }
    }
    C'est la synchronisation en général pour le EDT (Event Dispatcher Thread si je ne m'abuse pas trop)
    Euh ... Oui, mais non.

    Oui car AWT-EVENTQUEUE renvoie bien ce que tu dis, mais l'erreur est provoquée par un NullPointerException.

    Non car vous vous êtes tous focalisés sur cet élement en synchronisant tout bien comme il faut, mais l'erreur sous-jacente est toujours là, d'après ce que je lis. Il faudrait donc reprendre le problème à la base, savoir si lorsque vous ajoutez/supprimez des informations, vous informez bien le JTable qu'il doit aller chercher les nouvelles informations. En voyant le StackTrace original, j'ai la nette impression que non. Lorsque vous faites une modification dans le modèle, il faut appeler la méthode fireXxxYxx () correspondant à votre action (en supposant que vous avez étendu la classe javax.swing.table.AbstractTableModel ou javax.swing.table.DefaultTableModel pour votre modèle initial) plutôt que de demander de repeindre la JTable. La JTable est une API presque complète avec son propre package, ce qui signifie qu'elle n'est pas si simple d'utilisation que nous pourrions le penser au début.

    C'est moins lourd, c'est plus efficace, et y'a pas de problème de synchronisation.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. [POO] Erreur lors de l'utilisation de $this en PHP5
    Par Ekimasu dans le forum Langage
    Réponses: 4
    Dernier message: 03/11/2006, 20h21
  2. Erreur lors de l'utilisation de session_start();
    Par nane1474 dans le forum Langage
    Réponses: 8
    Dernier message: 30/06/2006, 12h06
  3. Erreur lors de l' utilisation des objets ADO
    Par aityahia dans le forum Bases de données
    Réponses: 10
    Dernier message: 24/03/2006, 13h46
  4. Eviter les erreurs lors de l'utilisation des compo Tsocket
    Par Coussati dans le forum Composants VCL
    Réponses: 5
    Dernier message: 01/02/2006, 19h14
  5. Erreur lors de l'utilisation de strlwr ?!
    Par MonsieurAk dans le forum C++
    Réponses: 4
    Dernier message: 05/12/2005, 10h22

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