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 :

Attendre la fin d'un SwingWorker


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 920
    Par défaut Attendre la fin d'un SwingWorker
    Bonjour,
    J'ai une méthode qui crée un gros objet data et son pendant graphique et qui retourne le pendant graphique.
    Pour faire ça j'ai créé une sous-classe du SwingWorker avec une variable public pour pouvoir récupérer mon objet graphique.
    Donc dans le doInBackground() je fais la création de l'objet data et dans le done() je fais la création de l'objet graphique sur base de l'objet data récupéré via get().

    Quand je lance le execute() je voudrais pouvoir être sûr d'attendre la complète exécution du doInBackground et du done afin de pouvoir récupérer mon objet graphique.

    Donc la question: est-ce que le execute() équivaut à un invokeLater ou à un invokeAndWait ? Si c'est à un invokeLater, comme forcer d'attendre la fin de l'exécution du done() (ou son annulation) ?

    Merci.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    le swingworker est destiné à faciliter la création de tache longues de calcul qui mettent à jour occasionellement l'UI. Il tourne dans son propre thread, pas via le thread de l'EDT!. Si t'as besoin d'attendre sa fin, il faut se questionner sur l'utilité alors du swingworker. Tu peux aussi bien tout faire dans ton thread courant en faisant tes update UI via invokeLater ou invokeAndWait.

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lvr Voir le message
    Donc la question: est-ce que le execute() équivaut à un invokeLater ou à un invokeAndWait ? Si c'est à un invokeLater, comme forcer d'attendre la fin de l'exécution du done() (ou son annulation) ?
    Aucun des deux ! invokeLater et invokeAndWait servent à exécuter du code dans l'EDT, et c'est l'inverse que l'on souhaite faire avec un SwingWorker.

    Le execute() lance le SwingWorker, c'est à dire :
    • La méthode doInBackground() qui est exécutée dans un thread à part.
    • Puis une fois fini, la méthode done() est exécutée dans l'EDT via invokeLater()...




    Tu veux afficher ton objet graphique à la fin du traitement c'est ca ? Dans ce cas il suffit tout simplement de le faire dans la méthode done()...


    a++

  4. #4
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 920
    Par défaut
    En fait j'ai une méthode qui duplique une fenêtre de données.
    Il y a plusieurs moyen de l'utiliser (via un menuitem, via drag&drop+touche CTRL, ...).
    Donc ce que je fais c'est une méthode qui duplique mais n'affiche pas, à charge du menuDuplication_actionPerformed(..), itemDropped(..) de l'appeller, de récupérer l'instance de la fenêtre et de la positionner là où ils veulent.

    Cette duplication est composée de deux "gros" traitements: un traitement data (duplication des datas) que je fais dans le doInBackground et un traitement graphique (création d'une fenêtre avec pas mal de composants) que je fais dans le done. Après quand les deux process sont terminés, j'aimerais récupérer l'instance de la fenêtre pour la retourner à l'appellant.

    Au début j'avais créé une Thread pour la partie data, qui à la fin lance le SwingUtilies.invokeAndWait pour la partie graphique. Je trouvais le SwingWorker plus propre et plus lisible, d'où mon changement de cap. Si retourne vers ce code d'origine, je ferais alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mythread.run();
    mythread.join();
    return mythread.fenetredupliquee;
    mais ça veut dire que je dois faire remonter "fenetredupliquee" du runnable d'invokeAndWait au runnable de la Thread, ... (
    Qu'est ce que vous pensez de cette solution ?

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par lvr Voir le message
    En fait j'ai une méthode qui duplique une fenêtre de données.
    Il y a plusieurs moyen de l'utiliser (via un menuitem, via drag&drop+touche CTRL, ...).
    Donc ce que je fais c'est une méthode qui duplique mais n'affiche pas, à charge du menuDuplication_actionPerformed(..), itemDropped(..) de l'appeller, de récupérer l'instance de la fenêtre et de la positionner là où ils veulent.

    Cette duplication est composée de deux "gros" traitements: un traitement data (duplication des datas) que je fais dans le doInBackground et un traitement graphique (création d'une fenêtre avec pas mal de composants) que je fais dans le done. Après quand les deux process sont terminés, j'aimerais récupérer l'instance de la fenêtre pour la retourner à l'appellant.

    C'est pas possible avec un swingworker pour plusieurs raisons. D'abord ca veut dire que tu bloque l'appelant pour faire ton traitement lourd, hors l'appelant est sur le thread de l'EDT puisque c'est une réaction à un event -> tu va givrer ton affichage. Ensuite le done d'un swingworker est fait aussi sur le thread de l'EDT que tu occupe, ce qui pose problème, car il ne sera exécuté que *après* que tu aie retourné à l'appelant (car traité en invokeLater).

    Ta structure, si c'est à l'appelant de positionner la fenetre, devrait etre ceci:
    1) création de la fenetre, lien vers des données vide
    2) retour à l'appelant, en parallèle, le swingworker démarre
    3) l'appelant positionne la fenetre, en parallèle, tes données sont dupliquée
    4) l'appelant a fini le boulot, un peu plus tard ton done() rempli la fenetre avec les données dupliquées et la rend visible.

  6. #6
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 920
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    C'est pas possible avec un swingworker pour plusieurs raisons. D'abord ca veut dire que tu bloque l'appelant pour faire ton traitement lourd, hors l'appelant est sur le thread de l'EDT puisque c'est une réaction à un event -> tu va givrer ton affichage. Ensuite le done d'un swingworker est fait aussi sur le thread de l'EDT que tu occupe, ce qui pose problème, car il ne sera exécuté que *après* que tu aie retourné à l'appelant (car traité en invokeLater).
    Ok J'avais pensé les chose sous cet angle.
    Ta suggestion remet pas mal de chose en question dans ma manière très séquentialisée de procéder, mais cela me semble le plus logique. Si je n'arrive pas à le faire comme tu suggères sans trop démonter mon code, je pense que passer un paramètre ou petite classe à appeller dans le done() quand la duplication de la fenêtre est faite ferait l'affaire aussi.

    Donc si je comprends bien:
    1) création de la fenetre, lien vers des données vide
    Fait indirectement dans mon menu_ActionPeformed => fait dans l'EDT => ok
    2) retour à l'appelant,
    3) l'appelant positionne la fenetre,
    Fait dans mon menu_ActionPeformed => fait dans l'EDT

    2) en parallèle, le swingworker démarre
    3) en parallèle, tes données sont dupliquée
    Lancé depuis l'EDT dans une thread en dehors de l'EDT => ok
    4) l'appelant a fini le boulot, un peu plus tard ton done() rempli la fenetre avec les données dupliquées et la rend
    Retour à l'EDT => ok

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 07/07/2010, 12h17
  2. [Processus][pause] attendre la fin ?
    Par MrDuChnok dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 19/07/2004, 13h51
  3. attendre la fin d'un processus
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 27/02/2004, 15h37
  4. Attendre la fin du chargement de la page dans un WebBrowser
    Par core1 dans le forum Web & réseau
    Réponses: 5
    Dernier message: 15/06/2003, 04h12
  5. Comment Attendre la fin d'un Processus
    Par mr_titi dans le forum C++Builder
    Réponses: 3
    Dernier message: 05/06/2003, 16h35

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