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 :

EDT : InvokeAndWait et InvokeLater


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Août 2008
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 265
    Par défaut EDT : InvokeAndWait et InvokeLater
    Bonjour,


    J'ai vu dans la documentation à quoi correspondent ces deux méthodes.
    Seulement dans un cadre un poil plus poussé, je me pose certaines questions :

    Dans mon thread je lance un runnable par l'intermédiaire d'un InvokeAndWait(). Si je lance dans mon runnable un nouveau runnable en InvokeLater(), que va-t-il se passer ?

    Autrement dit, le thread va-t-il attendre que le runnable secondaire se termine ?

    Et en inversant les deux méthodes ?



    Merci d'avance pour votre attention.

  2. #2
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Si dans un runnable passé en paramètre d'un invokeAndWait tu fais un invokeLater d'un second runnable, ce runnable sera exécuté APRÈS la fin de ton 1er.

    Si dans un runnable passé en paramètre d'un invokeLater tu fais un invokeAndWait, tu as une exception au runtime.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Août 2008
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 265
    Par défaut
    Ah ben c'est clair net et précis, merci

  4. #4
    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
    Salut,


    Pour plus de détail : l'EDT correspond en fait à une pile de tâche à exécuter. Il s'agit d'une pile FIFO (c'est à dire que les tâches sont exécutées dans l'ordre où elles arrivent).

    Ces tâches peuvent correspondre à des appel à invokeLater() ou invokeAndWait() ou à des traitements propre à l'EDT (mise à jour de l'affichage, gestion des événements...).


    Lorsque tu fais un invokeLater(), tu rajoutes simplement une tâche en fin de liste. Tu peux donc appeler cette méthode depuis n'importe où y compris depuis une tâche de l'EDT, et le traitement sera effectué plus tard.
    Il est d'ailleurs parfois utile d'utiliser un invokeLater() depuis l'EDT : par exemple lorsqu'on modifie un composant, les composants parents (comme un JScrollPane) sont avertis "plus tard" de cette modif, et utiliser invokeLater() permet de modifier le parent une fois que sont état est bien "à jour".


    invokeAndWait() fonctionne un peu différemment. En fait elle exécute un invokeLater() et passe donc le traitement en fin de pile. Mais elle utilise par dessus un mécanisme de synchronisation (wait/notify) afin de déterminer le moment où le traitement sera terminé, et bloque le thread courant en attendant. De ce fait invokeAndWait() ne peut pas être appeller depuis l'EDT car cela entrainerai un dead-lock puisque le thread s'attendrai lui-même (par sécurité cela provoque une exception).


    a++

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Août 2008
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 265
    Par défaut
    Ok ! Merci pour ces précisions je crois que ça commence à rentrer.


    En fait je pourrais peut-être expliquer ce qui me pousse à poser cette question.
    Mon graphique est géré dans le thread principal et mis à jour par l'intermédiaire d'Observable/Observer.
    Je lance un thread qui effectue des traitements. Celui-ci appelle notifyObserver() dans un runnable lancé par un InvokeAndWait().

    Si je ne me trompe pas, le runnable se termine sans que tous les update() appelés par notifyObserver() se soient terminés non ?
    Ben justement c'est ce que je voudrais bien faire


    PS : j'espère ne pas trop être embrouillant

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

Discussions similaires

  1. Multiple thread peuvent ils bloquer (EDT) malgre invokeLater
    Par murgen23 dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 12/09/2008, 08h56
  2. Réponses: 9
    Dernier message: 17/08/2006, 13h20
  3. EDT invokeLater et applet
    Par biozaxx dans le forum EDT/SwingWorker
    Réponses: 8
    Dernier message: 11/07/2006, 19h09
  4. Réponses: 17
    Dernier message: 10/07/2006, 20h13
  5. InvokeAndWait -> Pas possible depuis EDT ?
    Par ypicman dans le forum EDT/SwingWorker
    Réponses: 8
    Dernier message: 24/02/2006, 13h22

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