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

avec Java Discussion :

Modifier ma variable


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2015
    Messages : 3
    Par défaut Modifier ma variable
    Bonjour

    J'ai résolu mon problème mais je ne comprends pas mon erreur. Si vous pouvez m'aider à comprendre.
    En fait, je n'arrivais pas à modifier une variable avec la fonction reset. Je ne pouvais pas mettre à zero la variable "numberoftimes".

    Voila le code qui ne marchait pas :

    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
    import java.util.Timer;
    import java.util.TimerTask;
     
    import KiloboltGame.StartingClass;
     
    public class Time extends TimerTask {
     
       public int numberoftimes;
     
       public Time(){
    	numberoftimes = 0;
       }
     
    //*************************** ça fonctionne pas ***************************
       public void reset() {
    	numberoftimes = 0;
       }
    //***********************************************************************
       @Override
        public void run() {
             numberoftimes++;
        }
     
       private Timer t;
     
       public void startTimer() {
            t = new Timer();
            t.scheduleAtFixedRate(new Time(), 0, 1000);
        }
     
     
    }
    Et le code qui fonctionne :


    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
    34
    35
    36
    37
    38
    import java.util.Timer;
    import java.util.TimerTask;
     
    import KiloboltGame.StartingClass;
     
    public class Time extends TimerTask {
     
       public int numberoftimes;
     
       public Time(){
    	numberoftimes = 0;
       }
     
     
    //*************************** ça fonctionne ***************************
     
       public void reset() {
            t.cancel();
    	numberoftimes = 0;
            startTimer();
       }
     
    //********************************************************************
     
       @Override
        public void run() {
             numberoftimes++;
        }
     
       private Timer t;
     
       public void startTimer() {
            t = new Timer();
            t.scheduleAtFixedRate(new Time(), 0, 1000);
        }
     
     
    }

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    vu que tu ne vérifie jamais numberoftimes, comment tu sais ce qui marche ou pas?

    Ton code 2 est complètement différent. dans le premier tu crée deux fois Time(), celui sur lequel tu change les valeur et celui qui tourne dans le timertask
    Dans le deuxième, tu crée 3 instances. Celle sur laquelle tu change les valeur, celle qui monte dans le timertask et celle qui va le remplacer après le cancel.

    Retire toute trace de new Time() dans Time et tou ira bien, tu aura une seule instance.

  3. #3
    Candidat au Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2015
    Messages : 3
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    vu que tu ne vérifie jamais numberoftimes, comment tu sais ce qui marche ou pas?

    Ton code 2 est complètement différent. dans le premier tu crée deux fois Time(), celui sur lequel tu change les valeur et celui qui tourne dans le timertask
    Dans le deuxième, tu crée 3 instances. Celle sur laquelle tu change les valeur, celle qui monte dans le timertask et celle qui va le remplacer après le cancel.

    Retire toute trace de new Time() dans Time et tou ira bien, tu aura une seule instance.
    Pardon j'ai enlevé du code pour que cela soit plus lisible mais sinon j'avais une ligne pour afficher la variable.

    Supprimer new m'a mis un message d'erreur comme quoi il n'existe pas de méthode Time(). ( The method Time() is undefined for the type Time )

    Cancel a bien un rôle de destructeur ? En faisant t.cancel je détruis l'instance entre la variable t et la classe Time, et ensuite je la reconstruis en faisant startTimer(). Et comme je reconstruit l'instance il me relance le constructeur Time() qui remet à 0 la variable ? Est-ce acceptable comme programmation ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    @tchize_ n'a pas dit de retirer le new, mais le new Time(), sous entendu ne pas créer plusieurs instances de Time, donc l'une serait celle manipulée par le Timer, et l'autre celle sur laquelle reset() serait invoquée. Il faut toujours que ça soit la même instance, sinon ce n'est pas le même compteur (numberoftimes) qui est utilisé. Il ne suffit pas d'ailleurs de supprimer le new Time(), il faut le remplacer au moins par this. Mais dans le premier code, ça poserait un problème : pouvoir lancer plusieurs Timer sur la même instance, ce qui n'est probablement pas voulu.

    Pour le premier code, on pourrait faire également :

    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
    public class Time extends TimerTask {
     
       private volatile int numberoftimes;
     
       private Time(){
    	numberoftimes = 0;
       }
     
       public int getNumberOfTimes() {
            return numberOfTimes;
       }
     
       public void reset() {
    	numberoftimes = 0;
       }
     
       @Override
        public void run() {
             numberoftimes++;
        }
     
       public static Time startTimer() {
            Timer t = new Timer();
            Time time = new Time();
            t.scheduleAtFixedRate(time, 0, 1000);
            return time;
        }
     
    }
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Time chrono = Time.startTimer();
    chrono.reset(); // c'est bien la même instance de Time que celle manipulée par Time
    Mais avec ce code, impossible de terminer le chrono, sans fermer l'application.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    import java.util.Timer;
    import java.util.TimerTask;
     
    import KiloboltGame.StartingClass;
     
    public class Time extends TimerTask {
     
       private volatile int numberoftimes;
     
       public Time(){
    	numberoftimes = 0;
       }
     
       public void reset() {
            numberoftimes = 0;         
       }
     
       public int getNumberOfTimes() {
            return numberOfTimes;
       }
     
       @Override
        public void run() {
             numberoftimes++;
        }
     
       private Timer t;
     
       public synchronized void startTimer() {
            if ( t==null ) {
               t = new Timer();
               t.scheduleAtFixedRate(this, 0, 1000);
            }
            else {
                 reset();
            }
        }
     
        public synchronized void stopTimer() {
            if ( t!=null ) {
              t.cancel();
              t=null;
            }
       }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Candidat au Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2015
    Messages : 3
    Par défaut Merci beaucoup pour les réponses, je comprends mieux.
    Pour l'instant j'ai utilisé la solution de remplacer "new Time" par this. Je garde les autres solution sous le coude merci pour tout.

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

Discussions similaires

  1. Modifier la variable PATH
    Par al85 dans le forum Linux
    Réponses: 4
    Dernier message: 07/11/2008, 16h14
  2. Réponses: 3
    Dernier message: 12/09/2005, 16h38
  3. modifier une variable dans un fichier
    Par Guismay dans le forum Langage
    Réponses: 7
    Dernier message: 11/09/2005, 19h46
  4. Modifier la variable desktopwidth en delphi possible ?
    Par ludo5532 dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 31/08/2005, 08h12
  5. [.NET]Modifier les variables d'environnement dans...
    Par GusS dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 09/02/2005, 16h25

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