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 :

Quand utiliser SwingUtilities et/ou SwingWorker?


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Par défaut Quand utiliser SwingUtilities et/ou SwingWorker?
    Bonjour,

    voila, j'ai lu les differents tuto concernant l'EDT et le systeme de fonctionnement de SwingUtilities et de SwingWorker.
    J'ai juste 2 petites questions pour etre sur.

    1- En gros, si je ne suis pas dans l'EDT (!SwingUtilities.isEventDispatchThread()) et que je realise une action sur un composant graphique, je dois utiliser un des SwingUtilities.invoke* sinon, meme si ca marche je viole le systeme de Thread unique la, c'est bien ca?
    2- Pour le SwingWorker:
    J'ai un JTextPane avec un thread dessus qui part une boucle infinie refresh toutes les 5secondes le contenu car je change le design en fonction du temps passe etc...
    Serait-il recommande dans ce cas la d'utiliser un SwingWorker et de le terminer en quittant le programme, de la meme maniere qu'on termine un Thread (en mettant un boolean dans le while par exemple) ou ca ne sera finalement pas pertinent ?

    Merci d'avance pour vos reponses.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Oui pour ta première question.

    A priori oui également pour ta deuxième question, en utilisant doInBackground pour le traitement en arrière plan, et publish et process pour actualiser ton JTextPane.

  3. #3
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Par défaut
    Merci beaucoup pour la reponse

  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,

    Citation Envoyé par oldergod Voir le message
    1- En gros, si je ne suis pas dans l'EDT (!SwingUtilities.isEventDispatchThread()) et que je realise une action sur un composant graphique, je dois utiliser un des SwingUtilities.invoke* sinon, meme si ca marche je viole le systeme de Thread unique la, c'est bien ca?
    Oui.
    Les composants AWT/Swing ne sont pas thread-safe. C'est à dire qu'ils ne peuvent pas être utilisé depuis plusieurs threads à la fois. En l'occurrence l'EDT est le seul thread qui doit les manipuler.

    Si tu ne respectes pas cette règle, tu encours plusieurs types de problèmes plutôt obscurs liés aux accès concurrents, et même si cela semble marcher cela pourrait planter sans prévenir selon l'état des threads.

    Le gros problème c'est que ce genre de problème est difficile à mettre en évidence. Donc ton programme risque de planter de manière aléatoire, avec des erreurs parfois difficile à reproduire...




    Citation Envoyé par oldergod Voir le message
    2- Pour le SwingWorker:
    J'ai un JTextPane avec un thread dessus qui part une boucle infinie refresh toutes les 5secondes le contenu car je change le design en fonction du temps passe etc...
    Serait-il recommande dans ce cas la d'utiliser un SwingWorker et de le terminer en quittant le programme, de la meme maniere qu'on termine un Thread (en mettant un boolean dans le while par exemple) ou ca ne sera finalement pas pertinent ?
    Les SwingWorkers sont exécutés par défaut dans un thread daemon, c'est à dire un thread qui sera détruit lorsque qu'aucun autre thread "standard" n'existe. En clair il s'arrêtera automatiquement à la fin de ton programme.

    Les SwingWorkers sont fait pour exécuter des tâches "lourdes" en dehors de l'EDT, afin de ne pas bloquer ce dernier.

    En fait l'EDT correspond à un thread qui traite ses actions via une boucle infini :
    • Affichage des composants
    • Gestion des évènements
    • Exécution des SwingUtilities.invoke*()
    • ...


    Donc s'il faut obligatoirement y effectuer les modifications sur les composants, il ne faut pas y exécuter de traitement "lourd" ou "bloquant" sous peine de retarder le traitement de ses autres actions (affichage et gestion des évènements).

    SwingWorker est donc une classe utilitaire permettent d'exécuter du code lourd en dehors de l'EDT, tout en permettant un dialogue avec ce dernier (par exemple pour mettre à jour des données).


    Dans ton exemple avec le JTextPane, il faudrait avant tout savoir en quoi consiste ton traitement, car selon les cas tu pourrais peut-être également utiliser un Timer...

    a++

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

Discussions similaires

  1. [MySQL 5.0] RAND() inefficace quand utilisation de GROUP BY
    Par Takusen dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/11/2006, 15h39
  2. [POO] Quand utiliser une classe ?
    Par Gwipi dans le forum Langage
    Réponses: 8
    Dernier message: 05/05/2006, 14h31
  3. Réponses: 10
    Dernier message: 08/02/2005, 10h52
  4. Écriture dans un DBgrid quand utilise un query comme dataset
    Par dcayou dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 22h22
  5. [Procédure Stocké] Quand utiliser ?
    Par touhami dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/03/2004, 09h09

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