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

Java Discussion :

Chronomètre fait maison - problème de thread


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2007
    Messages : 165
    Points : 73
    Points
    73
    Par défaut Chronomètre fait maison - problème de thread
    Bonjour,

    J'ai fait une class pour un petit chronomètre maison.
    Cette class utilise un thread et la class main lance celle-ci.
    Mon but est de pouvoir mettre à jour dans une interface graphique (bien que pour l'instant je fais tout dans la console pour les testes) le chonomètre au dixième de milliseconde près.
    Le problème est que l'affichage (dans la console) du chronomètre ne se met à jour que toutes les 5 secondes.

    Voici le main :
    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
    import java.util.ArrayList;
     
     
    public class main {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		StopWatch sw = new StopWatch();
    		sw.startSP();
    		ArrayList time = new ArrayList();
    		while(true){
    			if(sw.getTime() == null){
    				System.out.println(time.get(2)+":"+time.get(1)+":"+time.get(0));
    			}else{
    				time.clear();
    				time.addAll(sw.getTime());
    				System.out.println(time.get(2)+":"+time.get(1)+":"+time.get(0));
    			}
     
     
    		}
     
    	}
     
    }
    Et la class du chronomètre même :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class StopWatch {
     
        private long startTime = 0;
        private long stopTime = 0;
        private boolean running = false;
        private boolean loop = true;
        private boolean authorizeGet = true;
        private Thread t;
        private final ArrayList time = new ArrayList();
     
        public StopWatch(){
        	/* init the variables */
        	this.time.add(0);
        	this.time.add(0);
        	this.time.add(0);
        	this.t = new Thread(new swThread());
        }
     
        public void startSP(){
        	this.t.start();
        }
     
        public void stopSP(){
        	this.loop = false;
        }
     
        private void startMS() {
        	this.startTime = System.currentTimeMillis();
            this.running = true;
        }
     
        private void stopMS() {
            this.stopTime = System.currentTimeMillis();
            this.running = false;
        }
     
     
        private long getElapsedTime() {
            long elapsed;
            if (running) {
                 elapsed = (System.currentTimeMillis() - startTime);
            }
            else {
                elapsed = (stopTime - startTime);
            }
            return elapsed;
        }    
     
    	public synchronized ArrayList getTime(){
    		if(authorizeGet){
    			return this.time;
    		}else{
    			return null;
    		}
    	}
     
    	private synchronized void setTime(ArrayList time){
    		this.time.clear();
    		this.time.addAll(time);
    	}
     
        public class swThread implements Runnable{
     
    		@Override
    		public void run() {
    			/* start the MS */
    	        startMS();
    	        long min = 0;
    	        long sec = 0;
    	        long ms = 0;
    	        while(loop){
    	        	ms = getElapsedTime();
    	        	if(ms >= 999){
    	        		sec++;
    	        		ms = 0;
    	        		/* stop the MS */
    	        		stopMS();
     
    	        		if(sec == 60){
    	        			min++;
    	        			sec = 0;
    	        		}
    	        		/* start the MS */ 
    	        		startMS();
    	        	}
     
    	        	/* get the first 2 digits */
    	        	String strMs = ((String)(""+ms));
    	        	if(strMs.length() >= 2){
    	        		strMs = strMs.substring(0, 2);
    	        	}else{
    	        		strMs = strMs.substring(0, 1);
    	        	}
     
    	        	/* create a temp time */
    	        	ArrayList time = new ArrayList();
    	        	time.add(strMs);
    	        	time.add(sec);
    	        	time.add(min);
     
    	        	/* block the get function to prevent accessing errors */
    	        	authorizeGet = false;
    	        	/* set the time */
    	        	setTime(time);
    	        	/* unblock */
    	        	authorizeGet = true;
     
    	        }			
    		}
     
        }
    }

    Comme vous pouvez le voire je trafique un peu pour ne pas avoir de problème d'accès a la variable time tout en essayant de garder le chronomètre à jour, mais cela ne fonctionne pas.
    Que me conseillez-vous ?

    Cordialement,

    rXp>!<

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 996
    Points
    7 996
    Par défaut
    Moi j'ai un affichage dans la console qui se mets a jour tout le temps puis un bon nullpointer exception. (Forcement y'a une boucle d'affichage dans le main() qui n'est bloqué par rien...)

    Entre nous ca a l'air bien compliqué ton code pour faire si peu, et en plus tu as fait des truc bizarre comme tu le dis toi même ^^.
    Est tu sure d'avoir besoin de tout cela ??? A mon avis tu devrais revoir la méthode ou alors je n'y ai rien compris =)

    Pour le chrono, il suffit d'un truc simple, je n'ai pas compris pourquoi tu utilisais un thread pour cela.
    Pour l'interface graphique, (si tu utilise swing) utiliser un Timer swing pour mettre a jour l'affichage tout les X secondes. Cette mise a jour interrogera ton chrono pour lui demander sa "valeur" et mettre le texte dans ton interface.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2007
    Messages : 165
    Points : 73
    Points
    73
    Par défaut
    D'accord merci, je ne connaissais pas le timer de swing
    Alors oui ma classe est énormément compliquée bien qu'était très simple tout au début (mais à force de modifier et essayer...).

    Je vais aller voire ce timer et je reviendrais si d'autres problèmes me bloquent véritablement

  4. #4
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2007
    Messages : 165
    Points : 73
    Points
    73
    Par défaut
    Rebonjour,

    Voilà j'ai mon chronomètre qui marche comme sur des roulettes
    Voilà mon code pour ceux que ça intéresse (hésitez pas à me donner des conseils pour l'optimiser):
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.DecimalFormat;
     
    import javax.swing.JLabel;
    import javax.swing.Timer;
     
    public class StopWatch extends JLabel implements ActionListener{
     
    	 	private DecimalFormat dotDoubleF = new DecimalFormat(".00");
    	 	private DecimalFormat doubleF = new DecimalFormat("00");
    	    private Timer timer = new javax.swing.Timer(1, this);
    	    private long startTime = 0;
    	    private long pause = 0;
     
    	    public StopWatch(){
    	    	this.when();
    	    }
     
    	 @Override
    	 public void actionPerformed(ActionEvent e) {
    		 setText(when());
    	 }
     
    	 private String when() {
    		 /* get the seconds : sec.ms */
    		 String secMs = dotDoubleF.format((System.currentTimeMillis() - startTime) / 1000d);
    		 /* get the ms from the sec.ms */ 
    		 String ms = secMs.substring(secMs.length()-2,secMs.length());
     
    		 /* get the sec from sec.ms */
    		 String sec = "0";
    		 if(secMs.length() != 3){
    			 sec = secMs.substring(0,secMs.length()-3);
    			 sec = doubleF.format(Integer.parseInt(sec));
    		 }
     
    		 /* get the min from the sec */
    		 String min = doubleF.format(Integer.parseInt(sec) / 60);
     
    		 /* reinit the sec to 0 if its more than a min */
    		 if(Integer.parseInt(min)>0){
    			 sec = doubleF.format((Integer.parseInt(sec) - (60*Integer.parseInt(min))));
    		 }
     
    		 return min+":"+sec+":"+ms;
    	 }
     
    	 public void start() {
    		 /* init the stopwatch */
    		 startTime = System.currentTimeMillis();
    		 timer.start();
    	 }
     
         public void stop() {
        	 timer.stop();
         }
     
         public void pause(){
        	 /* stock the time of the stopwatch */
        	 pause = System.currentTimeMillis() - startTime;
        	 timer.stop();
         }
     
         public void unpause(){
        	 /* set the correct time to the stopwatch */
        	 startTime = System.currentTimeMillis() - pause;
        	 timer.start();
         }
     
    }
    Je ne pense pas avoir besoin de mettre le main, il coule de source.

    Cordialement,

    rXp>!<

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

Discussions similaires

  1. Problème de Cache d'image (fait maison)
    Par LoKiDemon dans le forum Langages serveur
    Réponses: 0
    Dernier message: 09/12/2010, 14h32
  2. Problème d'utilisation de Dll faite maison. . .
    Par _SamSoft_ dans le forum Windows
    Réponses: 27
    Dernier message: 20/02/2007, 13h55
  3. Problème avec un composant fait maison
    Par gandf dans le forum C++Builder
    Réponses: 6
    Dernier message: 17/07/2005, 13h30
  4. package fait maison
    Par kij dans le forum Modules
    Réponses: 6
    Dernier message: 20/04/2005, 16h57
  5. [VC++6][DX9] Problème de thread lors d'un blit ...
    Par grandjouff dans le forum DirectX
    Réponses: 2
    Dernier message: 12/06/2003, 22h22

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