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 methode FIFO ?


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 51
    Par défaut EDT methode FIFO ?
    Bonjour,
    j'ai une question existentielle sur la maniere dont fonctionne l'EDT et l'affichage en general. Si j'ai bien tout compris ce que j'ai lu, l'EDT fonctionne selon la methode du First In First Out.
    Pourquoi dans ce cas, qd je fais par ex : (etant deja dans l'EDT)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    changeJTextFieldColor();
    Thread.sleep(1000);
    changeJTextFieldColor();
    pourquoi disais-je le fonctionnement est :
    blocage de l'affichage pdt 1 sec puis changement de la couleur de mon JTextField 2 fois tres rapidement.

    J'ai essayé de lancer l'ensemble de ce code dans un nouveau thread, puis de lancer chacune de ces actions dans l'EDT avec un invokeAndWait() et là j'obtiens le fonctionnement désiré....
    je n'y comprend rien...

    Qq'un pourrait il eclairer ma lanterne ?

    Merci ! :-)

  2. #2
    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,

    Citation Envoyé par taillooo
    Si j'ai bien tout compris ce que j'ai lu, l'EDT fonctionne selon la methode du First In First Out.
    Oui : les tâches sont exécutées les unes après les autres dans leurs ordre d'arrivée...


    Citation Envoyé par taillooo
    Pourquoi dans ce cas, qd je fais par ex : (etant deja dans l'EDT)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    changeJTextFieldColor();
    Thread.sleep(1000);
    changeJTextFieldColor();

    pourquoi disais-je le fonctionnement est :
    blocage de l'affichage pdt 1 sec puis changement de la couleur de mon JTextField 2 fois tres rapidement.
    C'est simple : ton code correspond à une seule tâche, décomposé en trois partie :
    • Tu changes l'attribut de couleur de ton JTextField.
    • Tu endors l'EDT pendant 1 secondes
    • Tu changes à nouveau l'attribut de couleur de ton JTextField.


    Or il se trouve que l'EDT ne gère pas seulement tes tâches, mais également ses propres tâches qui s'occupent de dessiner les composants et de gérer les composants. Du coup la pile des tâches de l'EDT pourrait correspondre à ceci :
    • Dessiner les composants graphique si besoin.
    • Traiter les évènements (clic de souris, clavier, etc.).
    • Exécuter ta tâche
    • Dessiner les composants graphique si besoin.
    • Traiter les évènements (clic de souris, clavier, etc.).
    • ...


    Du coup dans ton code tu changes 2 fois la couleur de ton composant, mais comme il n'est pas re-dessinée entre les deux ce changement n'apparait pas...


    Bref : l'EDT ne doit comporter que du code qui modifie les composants graphiques, mais surtout pas de code bloquant ou trop gourmand...

    a++

  3. #3
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 51
    Par défaut
    merci pour ta reponse adiGuba.

    Je comprend bien ce que tu me dis. Mais j'ai encore 2 questions :

    - pourquoi si j'insere un JtextField.repaint() par exemple, entre les 2 changements de couleurs, cela ne change t il rien ?
    est-ce parce que la aussi l'EDT gere tout comme une seule tache ? mais a ce moment la, peut-on savoir a quel moment il va redessiner les composants ?

    - saurais-tu me dire comment inserer une pause equivalente a mon premier code ? ou suis-je contrains a réagir obligatoirement a un evenement graphique style click de bouton ?

    Merci encore :-)

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    changeJTextFieldColor();
    new Thread(new Runnable() {
        public void run() {
            Thread.sleep(1000);
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    changeJTextFieldColor();
                }
            });
        }
    }).start();

  5. #5
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 51
    Par défaut
    oui j'y avais pensé, mais si on veut etre pointilleux, on peut dire que pendant 1 sec l'IHM n'est pas bloqué puisque c un thread classique, donc l'utilisateur peut faire une autre action.... comment empecher ca ? (en mettant tout de meme l'IHM a jour)

  6. #6
    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
    Citation Envoyé par taillooo
    oui j'y avais pensé, mais si on veut etre pointilleux, on peut dire que pendant 1 sec l'IHM n'est pas bloqué puisque c un thread classique, donc l'utilisateur peut faire une autre action.... comment empecher ca ? (en mettant tout de meme l'IHM a jour)
    Tu veux empêcher l'utilisateur de faire une action?
    Tu fais un setEnabled(false) sur les boutons... Ou tu mets un JPanel en GlassPane qui capture les clics.

  7. #7
    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 taillooo
    - pourquoi si j'insere un JtextField.repaint() par exemple, entre les 2 changements de couleurs, cela ne change t il rien ?
    Parce que la méthode repaint() ne re-dessine pas immédiatement le composant. Elle indique "seulement" que le composant doit être re-déssiné dès que possible, et donc dès que l'EDT revient dans sa tâche "Dessiner les composants graphiques"...

    Et comme tu fais un sleep(1000) juste après, tu retardes ce moment...

    Citation Envoyé par taillooo
    est-ce parce que la aussi l'EDT gere tout comme une seule tache ? mais a ce moment la, peut-on savoir a quel moment il va redessiner les composants ?
    Non il gère les tâches les unes à la suites. Mais il ne faut surtout pas le bloquer sinon tu retardes TOUS ses traitements...


    Bref, encore une fois : le code qui s'exécute dans l'EDT doit être le plus rapide possible, et se contenter d'accéder/modifier aux propriétés des composants.



    Citation Envoyé par taillooo
    - saurais-tu me dire comment inserer une pause equivalente a mon premier code ? ou suis-je contrains a réagir obligatoirement a un evenement graphique style click de bouton ?
    L'EDT ne doit pas être mis en pause car cela provoquerait un gel de l'interface du plus mauvais effet...

    Donc, soit tu désactive tous tes composants, soit tu utilises un GlassPane pour bloquer tous les évenements (lire : Attendre avec style et l'API Swing)

    Citation Envoyé par taillooo
    a quoi sert un repaint dans le contexte de ce sujet ? a rien je suppose.
    Simplement à indiquer que le composant devra être re-dessiner dès que possible (c'est d'aileurs indiqué dans la doc)

    a++

  8. #8
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 51
    Par défaut
    Salut,
    ok tout est clair à present. Je vais aller lire le lien que tu m'as fourni.

    Merci beaucoup et bonne journée!

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

Discussions similaires

  1. [METHODE] -> Détection de virus ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/02/2004, 18h04
  2. Passage de variable par methode post ?
    Par oazar dans le forum Flash
    Réponses: 33
    Dernier message: 16/10/2003, 18h03
  3. garder un FIFO ouvert en lecture
    Par OuiOui dans le forum Réseau
    Réponses: 4
    Dernier message: 05/01/2003, 20h24
  4. Methode de drcherche a l,interieur de basse de donner texte
    Par philippe V dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 03/12/2002, 11h20
  5. Recherche code d'un fifo,ou explication
    Par don-diego dans le forum C
    Réponses: 8
    Dernier message: 25/07/2002, 11h26

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