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 :

swingworker et méthode done().


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre régulier
    Homme Profil pro
    Dévelopeur Cobol + Java J2SE
    Inscrit en
    novembre 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dévelopeur Cobol + Java J2SE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2007
    Messages : 72
    Points : 77
    Points
    77
    Par défaut swingworker et méthode done().
    bonjour, dans ma classe Controleur, j'ai défini une méthode valider() qui est invoquée quand on veut valider les données saisies depuis x écrans (classes MonEcran1, MonEcran2 ...).

    Elle lance un swingWorker, qui a une méthode Void doInBackGround() qui contient une méthode abstraite traitementLent(), laquelle est implémentée différemment selon les écrans.
    Dans chaque écran, traitementLent() manipule des objets différents.
    Et chaque écran implémente aussi une méthode miseAJourEdt(), exécutée depuis done() une fois traitementLent() terminé, et aura besoin de données calculées dans traitementLent().

    Question : les objets calculés par traitementLent() doivent ils forcément être retournés par traitementLent() (+ ajout de get()) si je veux les utiliser dans le done() ? dans le cas MonEcran1, panel.add(graphe) plante parfois en null pointer.

    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
    class Controleur{
       void valider(){
          new Worker(Void, Void).execute();
       }
    }
     
    public class Worker extends SwingWorker(Void,Void){
       @overide
       Void doInBackground(){
          traitementLent();
       }
       @overide
       Void done(){
          miseAJourEdt();
       }
    }
     
    public class MonEcran1 {
       jpanel Panel,JFreeChart graphe;
       @overide
       void traitementLent(){
          graphe = fabriqueGraphe();// traitement lent
       }
       @overide
       void miseAJourEdt(){
          panel.add(graphe);// traitement EDT
       }
    }
    public class MonEcran2 {
       ...
       @overide
       void traitementLent(){
          ...()// traitement lent
       }
       @overide
       void miseAJourEdt(){
          ...// traitement EDT
       }
    }

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 467
    Points : 48 756
    Points
    48 756
    Par défaut
    Citation Envoyé par CobolProgrammator Voir le message
    Question : les objets calculés par traitementLent() doivent ils forcément être retournés par traitementLent() (+ ajout de get()) si je veux les utiliser dans le done() ? dans le cas MonEcran1, panel.add(graphe) plante parfois en null pointer.
    Tu fais comme tu veux, mais si tu ne retourne pas la valeur depuis le doInBackground() pour y accéder via get(), n'oublie pas que c'est alors à toi de gérer le fait que deux thread différent y accèdent. Nottement le fait que le thread de l'EDT, au moment de l'exécution du done() ne vois pas nécessairement les valeurs que doInBackground() a créé si elle ne sont pas volatile et si il n'y a pas eu de point de synchronisation.


    au passage, done() retourne void, pas Void.

  3. #3
    Membre régulier
    Homme Profil pro
    Dévelopeur Cobol + Java J2SE
    Inscrit en
    novembre 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dévelopeur Cobol + Java J2SE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2007
    Messages : 72
    Points : 77
    Points
    77
    Par défaut
    merci Tchize_,

    donc pas la peine d'appeler get() si je déclare volatile les variables calculées dans le traitement lent. Et je dois faire un point de synchronisation =>
    1 - tu peux me dire en quoi ça consiste ? (exemple)
    2 - quel est le fin mot de l'histoire : si on dit sur SwingWorker que le done() s'exécute dans l'EDT quand doInBackGround() est fini, alors on peut se passer du get() si l'objet "graphe" est déclaré au niveau de la classe (donc à l'extérieur de doInBackground()) non ?

    je précise bien sûr que dans miseAJourEdt() qui est appelé depuis le done() je ne mets pas à jour l'objet "graphe" , je ne fais que le lire ou l'ajouter à un champ du panel.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 467
    Points : 48 756
    Points
    48 756
    Par défaut
    Citation Envoyé par CobolProgrammator Voir le message
    merci Tchize_,

    donc pas la peine d'appeler get() si je déclare volatile les variables calculées dans le traitement lent. Et je dois faire un point de synchronisation =>
    "Ou" pas "et"
    Citation Envoyé par CobolProgrammator Voir le message
    1 - tu peux me dire en quoi ça consiste ? (exemple)
    Tout ce qui invalide le cache mémoire du thread. Typiquement: les sleep, les synchronized, les io bloquants. Dans ton cas, un synchronized sur la methode.


    Citation Envoyé par CobolProgrammator Voir le message
    2 - quel est le fin mot de l'histoire : si on dit sur SwingWorker que le done() s'exécute dans l'EDT quand doInBackGround() est fini, alors on peut se passer du get() si l'objet "graphe" est déclaré au niveau de la classe (donc à l'extérieur de doInBackground()) non ?
    le done s'exécute dans le thread EDT, le doInBackground s'exécute dans un autre thread. Tu dois avoir la garantie que ce qu'a fait cet autre thread est visible du thread EDT. Les champs de classe non volatile ne le sont pas d'office. C'est du au optimisation au niveau de la mémoire entre les threads. Il faut un évènement qui dise au thread (ici EDT) attention, on va aller chercher des trucs qu'un autre thread a peut être modifié (ton champ graphe), donc au revoir les optimisation de cache, je veux la valeur qui sorte de la mémoire centrale, pas du cache CPU ou d'un registre.

  5. #5
    Membre régulier
    Homme Profil pro
    Dévelopeur Cobol + Java J2SE
    Inscrit en
    novembre 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dévelopeur Cobol + Java J2SE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2007
    Messages : 72
    Points : 77
    Points
    77
    Par défaut
    bon finalement en déclarant graphe volatile, j'ai eu un cas où ça m'a refait null pointer.
    J'ai abandonné cette solution.
    Puis j'ai ajouté un Thread.sleep(1) , comme tu suggérais pour synchroniser, à la fin du doInBackGround() , et pour l'instant ça n'a pas refait de null pointer.
    Merci.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 467
    Points : 48 756
    Points
    48 756
    Par défaut
    nan mais le thread.sleep c'est n'importe nawak. Utilise le get alors

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

Discussions similaires

  1. SwingWorker et méthode done
    Par SAKDOSS dans le forum EDT/SwingWorker
    Réponses: 0
    Dernier message: 22/04/2012, 15h11
  2. sécurité méthode post, interception de donées
    Par diffy dans le forum Langage
    Réponses: 4
    Dernier message: 02/07/2008, 11h05
  3. [SwingWorker] Thread.sleep(x) et done()
    Par SpecialCharacter dans le forum EDT/SwingWorker
    Réponses: 4
    Dernier message: 15/02/2008, 16h42
  4. [SwingWorker] Arret d'une méthode sans raisons..
    Par Blaise1 dans le forum Général Java
    Réponses: 2
    Dernier message: 14/02/2008, 18h34
  5. SwingWorker et la méthode done()
    Par speedster dans le forum EDT/SwingWorker
    Réponses: 2
    Dernier message: 20/11/2007, 15h00

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