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

Langage Java Discussion :

Reconfigurer un TimerTask


Sujet :

Langage Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 70
    Points : 59
    Points
    59
    Par défaut Reconfigurer un TimerTask
    Bonjour a tous,

    Dans le code ci-dessous, je construis un TimerStack pour call des méthodes etc .. J'ai configure le TimerTask suivant une période dans ma variable SPEED. Toutefois, cette variable peut changer de valeur, je dois donc ré-actualiser sa valeur dans le TimerTask.

    Je cancel mon TimerTask, si la valeur de ma variable SPEED est différente de speed. Et j'essaie de le faire repartir avec la nouvelle période mais ça bloque ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     public void MyThread() {
            Runnable myRunnable = new Runnable() {
                public void run() {
     
                    final TimerTask task = new TimerTask() {
                        @Override
                        public void run() {
                            if (!(isOnStation())) {
                                // Code .. 
                            } else {
                                try {
                                    // Code ..
                                    Thread.sleep(300);
     
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                            if(speed != SPEED){
                                cancel();
                                speed = SPEED;
                                run();
     
                            }
                        }
                    };
                    Timer timer = new Timer();
                    timer.scheduleAtFixedRate(task,500, SPEED);
                }
            };
            Thread thread = new Thread(myRunnable);
            thread.start();
        }
    Merci d'avance de vos conseils!

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Holala, une timertask avec un sleep (mauvais point), lancée depuis un runnable lui même mis dans un thread destiné juste à créer le timer. T'es occupé de sur-complexifier ton système.

    On ne peut pas rescheduler une tâche ou la recycler. Par contre on peux en créer une nouvelle, et annuler la précédente avec cancel(). Donc pas besoin de créer de multiple timer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    private void scheduleTask(final Timer timer, long interval) {
          final TimerTask task = new TimerTask() {
                        @Override
                        public void run() {
                            if (!(isOnStation())) {
                                // Code .. 
                            } else {
                                try {
                                    // Code ..
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                            if(speed != SPEED){
                                cancel();
                                speed = SPEED;
                                scheduleTask(timer,speed);
     
                            }
                        }
          };
          timer.scheduleAtFixedRate(task,500, interval);
    }
    public void makeTimer() {
                    Timer timer = new Timer();
                    scheduleTask(timer,SPEED);
    }
    Et pas besoin de Thread ni de Runnable. Je rappelle au passage que les méthodes doivent avoir un nom de la forme faireQuelqueChose() et non pas UnTruc(). Ce sont les noms de classe qui commencent par des majuscule. Tu ne devrais pas non plus avoir deux variables avec juste les majuscules de différence entre les deux, c'est source de confusion pour le lecteur. De toutes façons les variables / champs on la forme "unChamp", ils commencent par une minuscule. Seules les constantes sont écrites tout en majusucle.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 70
    Points : 59
    Points
    59
    Par défaut
    Salut tchize_,

    Oui, je me doute que ça doit pas être top top .. Je comme ce a peine a utiliser TimerTask et Timer.

    T'es occupé de sur-complexifier ton système.
    Je t'avoue que j'ai pris cet exemple sur un forum .. Maintenant que tu me le dis et après avoir étudier la chose , c'est vrai que c'est totalement inutile . Je ne pensais pas que TimerTask créait ses propres Threads .. D'autant plus la structure syntaxique est vraiment dégueu, je devais la revoir ..

    En ce qui concerne la syntaxe, je n'es pas applique les règles de base: c'est un brouillon total modifie x fois après quelques tests. Mais j'approuve et retiens tous tes conseils sur le sujet!

    Merci pour ton post!

    Correction apportées , marche impec'

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 70
    Points : 59
    Points
    59
    Par défaut
    Juste dernière question car j' ai pas vu beaucoup d'info sur le sujet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Holala, une timertask avec un sleep (mauvais point)
    Il vaut mieux utiliser un wait(), j'imagine?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    non une timerTask doit s'exécuter rapidement (cf la javadoc), donc elle ne peux pas s'endormir ou se mettre en pause. Il n'y a pas de raison d'ailleurs de la faire dormir. Le timer se charge déjà de la cadencer à intervalle régulier.

    Quand à wait, c'est autre chose. Le couple wait/notify sert à gerer les verrous entre threads.

    Au passage une timerTask ne crée pas de Thread. C'est le Timer qui possède un Thread.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 70
    Points : 59
    Points
    59
    Par défaut
    Ok, d’accord je comprend l’idée.

    Mais je t'avoue que ça m’embête un peu car je dois faire quelque chose dans ce sens la:
    1. Lancer un thread
    2. Faire bouger un objet visuel avec ce thread (et vérifier d'autres conditions)
    3. Si l'objet rencontre les bonnes conditions le faire s’arrêter (le temps du sleep())
    4. Et rebelote ...


    Si je fais appel a un Thread a l’intérieur dans mon TimerTask (qui s'occupera de faire ce que fait le TimerTask actuellement) et que je met un Sleep() sur ce Thread. Est-ce une meilleur démarche ?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    la question est plutot dans ce cas pourquoi as-tu besoin d'un timer si un Thread autonome dans lequel tu gère toi même ton timing suffit?

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 70
    Points : 59
    Points
    59
    Par défaut
    Je crois comprendre ton idée ..

    1. Le thread fait avancer l'objet
    2. Il sleep() avant de reavancer ou s’arrêter a un point. A ce niveau la, la durée du sleep() est égal a mon intervalle du TimerTask
    3. Si il croise un point prédéfini, il s’arrête et fait son job
    4. Il sleep() plus longtemps
    5. Et rebelote


    Le tout dans un while(true) pour qu'il recommence continuellement.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    plutôt dans un while(!stop) histoire de pouvoir l'arrêter

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 70
    Points : 59
    Points
    59
    Par défaut
    Oui, effectivement!

    Merci beaucoup pour tes explications.

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

Discussions similaires

  1. TimerTask et Timer
    Par daninho dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 14/04/2007, 15h56
  2. Réponses: 2
    Dernier message: 13/02/2006, 08h26
  3. Reconfiguration de la Table de Partition
    Par onyouma dans le forum Composants
    Réponses: 1
    Dernier message: 30/12/2005, 17h24
  4. Reconfigurer l'heure systeme avec dpk-reconfigure ?
    Par vosaray dans le forum Debian
    Réponses: 2
    Dernier message: 22/11/2005, 14h01
  5. [CPAN] comment reconfigurer CPAN
    Par fabrice1596 dans le forum Modules
    Réponses: 1
    Dernier message: 31/10/2005, 11h52

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