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 :

Probleme : Comment attendre qu'une autre classe finisse son traitement?


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Par défaut Probleme : Comment attendre qu'une autre classe finisse son traitement?
    Bonjour,
    mon probleme consiste en la synchronisation de mon code.
    j'ai une classe A qui creer un objet de la classe B, cette classe B utilise SwingWorker pour effectuer d'un coté un traitement long (15 secondes) et d'un autre coté afficher une barre de progression grace à l'EDT.
    Mon problème vient du fait que je veux que ma classe A attende à l'issue de la creation de l'objet B que le traitement de B soit terminé. En effet, j'ai besoin des résultats du traitement pour poursuivre le code de A. La terminaison du traitement peut etre détéctée lorsque la méthode done (de Swingworker dans la classe B) est appelée, toutefois je ne vois pas comment m'en servir pour faire un "code d'attente" pour la classe A.

    Actuellement je fais une boucle dans A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while ( endLoad!= true) { Thread.sleep(250); }
    sachant que c'est done qui change la valeur du booleen. Toutefois cette méthode à de gros inconvénients et je cherche quelque chose de plus performant.
    Pouvez-vous m'aider?
    Merci d'avance

  2. #2
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Pourquoi tu ne fais pas dans le done de ton worker ce que tu souhaiterais faire après le worker ?

    Tu peux aussi utiliser les listeners, et générer un évènement dans le done pour signaler aux écouteurs que le travail est fini...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Par défaut
    Le code dans A est extremement volumineux, et par soucis de clarté et de séparation du code il n'a pas à etre dans B qui est une classe uniquement dédiée à effecteur un traitement particulier (un gros chargement).
    Pour ce qui est des listener, je vois le principe mais coté syntaxe je sèche j'ai besoin d'un peu d'aide.

    Je résume donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class A
    {
    ...
    ...
    B monObjetB = new B();
    //Ici je dois attendre
    //Quand B a fini je veux reprendre le traitement
    ...
    ...
    }
    Quel genre de listener dois je placer sur B?
    Comment creer une attente qui soit la moins gourmande possible (en CPU), car la boucle qui ne fait rien...c'est pas des plus léger... Dois-je mettre le reste de mon code dans le listener, et ce dernier sera donc executé lorsque l'événement "fin_du_traitement" arrivera?
    Merci d'avance

  4. #4
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Il faut que dans B tu gère une liste de listener à toi. Genre tu crées une interface BListener, avec une méthode dedans : void BDone();

    Lorsque tu crées B, tu fais un B.addBListener(this); après avoir implémenté la méthode d'ajout d'un listener, et this référençant A, implémentant cette BListener interface...

    Ensuite, lorsque ton A lance le worker B, ta méthode dans A est finie, et laisse la main au worker B. Celui-ci alors, dans la méthode done invoque la méthode BDone sur tous les listeners enregistré dans celui-ci, ce qui aura pour effet d'invoquer la méthode BDone dans A, qui pourra donc faire la suite du traitement...

    Si tu veux les patrons de code en Java, n'hésite pas, juste que ca me prendra un peu plus de temps

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Par défaut
    Si j'ai bien compris je devrais avoir quelque chose comme ça :
    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
     
     
    class A
    ...
    B monObjetB = new B();
    monObjetB.addListener(new BListener(){
    public void bMethode()
    {
    //Le reste du code de A
    }
    });
     
    //----------------
     
    class B
     
    //Dans la class SwingWorker
     
    public void done()
    {
    //le code normal de done
    bMethode();
    }
    C'est surtout pour l'appel à la méthode bMethode dans done que je doute vraiment de moi... peux tu me dire si c'est ça?

  6. #6
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Ben en fait, le fonctionnement des listener permet de faire des trucs plus puissants... Tu peux mettre en relation plusieurs objets entre eux, pas seulement un objet relié à un autre (cf le modèle MVC dans Swing par exemple). Donc pour faire un truc générique et assez souple, tu gères une liste de BListener dans B. Puis au lieu de faire bMéthode tout court, tu parcours cette liste de listeners sur lesquels tu invoques la méthode bListener...

    genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (BListener l : mesListenersDansBQuiEstUneCollection)
     l.bMethode();

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/12/2006, 21h45
  2. Probleme appel de fct dans une autre classe
    Par crakotte_finance dans le forum C++
    Réponses: 6
    Dernier message: 09/10/2006, 22h22
  3. Probleme d'apel de fonction dans une autre classe
    Par freecell31 dans le forum MFC
    Réponses: 24
    Dernier message: 13/05/2006, 12h34
  4. Réponses: 1
    Dernier message: 05/05/2006, 15h37
  5. Réponses: 2
    Dernier message: 02/05/2006, 15h34

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