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 :

java.util.timer et réévaluation dynamique de la périodicité dans un contexte Swing


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut java.util.timer et réévaluation dynamique de la périodicité dans un contexte Swing
    Bonjour,

    Voici la description de ce que je souhaite réaliser.
    J’ai une IHM Swing qui doit lancer des appels web et parser le flux HTML reçu pour l’afficher dans un composant JeditorPane.
    Cette séquence ‘appel +parsing+affichage du resultat’ est périodique (toutes les 10s par ex.)
    Jusque là, rien de bien méchant (enfin presque…)
    Ayant lu tout ce que je pouvais trouver sur SwingWorker, java.util.Timer, et javax.swing.Timer, j’en ai tiré les conclusions suivantes :

    • 1. javax.swing.Timer ne peut pas répondre à mon besoin car je veux que mon IHM reste réactive et le traitement de la séquence s’effectuerait dans l’EDT ce qui, avec des appels Web, serait fatal. Ai-je raison ?
    • 2. à la différence de javax.swing.Timer, java.util.Timer ne s’exécute pas dans l’EDT, donc pas de risque de blocage. Je prévoyais donc d’utiliser un TimerTask dans lequel je code toute ma séquence ‘appel +parsing+affichage’, en terminant par un SwingUtilities.invokeLater pour mettre à jour le Jeditorpane avec le résultat du parsing HTML.


    MAIS, et c’est là mon problème principal, la séquence d’appel ci-dessus peut m’amener à changer la périodicité d’appel. Or, sauf erreur, je n’ai pas vu de possibilité pour un Timer de modifier dynamiquement la périodicité d’éxécution du TimerTask. Pouvez-vous me le confirmer ? Si oui, comment puis-je résoudre simplement mon problème (j'ai l'impression de construire une usine à gaz...) ? Avez-vous un squelette de code ?

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    La méthode préconisée est plutôt de coupler Timer Swing et SwingWorker.

    Un timer Swing qui se réveille toutes les X secondes qui déclenche l'exécution d'un SwingWorker, qui lui fait la récupération des infos dans son doInBackground() et une fois la récupération effectuée met à jour l'interface dans sa méthode done().

    Cf cours/tutos sur le SwingWorker.
    Voilou

  3. #3
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut
    Oui, mais comment mettre à jour la périodicité du timer (mon traitement peut amener à redéfinir la fréquence du timer , par ex. passer d'un traitement tous les 10s à un traitement tous les 5s) ??

  4. #4
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282

  5. #5
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut
    Citation Envoyé par herve91 Voir le message
    Sans avoir besoin d'arrêter le timer et de le redémarrer ? Parce qu'avec java.util.Timer, ce que tu proposes n'est pas possible.

  6. #6
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Oui, il s'agit bien de javax.swing.Timer

  7. #7
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut
    Citation Envoyé par herve91 Voir le message
    Oui, il s'agit bien de javax.swing.Timer
    Bon, ok je vais essayer ce que tu me proposes.
    Et pour rebondir sur la question que j'ai posée dans un autre fil sur lequel tu m'as répondu, si je ferme mon application (soit par le menu File>exit, soit par la fenêtre), un simple timer.stop() suffit-il (sachant que le swingWorker s'exécute en tâche de fond) ?

  8. #8
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Citation Envoyé par lvfco Voir le message
    Et pour rebondir sur la question que j'ai posée dans un autre fil sur lequel tu m'as répondu, si je ferme mon application (soit par le menu File>exit, soit par la fenêtre), un simple timer.stop() suffit-il (sachant que le swingWorker s'exécute en tâche de fond) ?
    timer.stop() ne quitte pas l'application mais ne fait qu'arrêter le timer (ainsi tu n'auras plus de déclenchement de nouvelles tâches).

  9. #9
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut
    Citation Envoyé par herve91 Voir le message
    timer.stop() ne quitte pas l'application mais ne fait qu'arrêter le timer (ainsi tu n'auras plus de déclenchement de nouvelles tâches).
    Oui, bien sûr...j'ai fait un raccourci;
    Pour arrêter mon appli, je dois arrêter le timer par timer.stop() et ensuite quitter l'application par system.exit(0).
    Si je quitte l'application alors qu'un swingworker est en cours d'exécution, estce que ça pose problème ?

  10. #10
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Un SYstem.exit(0) va tuer toute ton appli, y compris les threads en cours d'exécution. Ce qui n'est pas forcément, suivant les cas, une bonne chose.

    Si tu veux que ton application s'arrête de façon non violente il te faut arrêter les timers et appeler la méthode dispose de ta jframe. De ce fait les ressources de la JFrame et des timers seront libérées, et tes threads en cours pourront s'arrêter normalement.

Discussions similaires

  1. java.util.Timer dans JavaFx2.0
    Par Limack dans le forum JavaFX
    Réponses: 4
    Dernier message: 27/01/2012, 03h23
  2. java.util.Timer ou Quartz ?
    Par dingoth dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 25/01/2010, 14h27
  3. java.util.Timer et EJB
    Par hb2ee dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 14/04/2009, 12h21
  4. [java.util.Timer]Comment arrêter l'exécution d'un Thread
    Par Invité dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 07/06/2006, 08h54
  5. Réponses: 4
    Dernier message: 06/02/2004, 17h23

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