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 :

Problème de Thread: Execution simultanée


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Rien
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Rien

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Points : 17
    Points
    17
    Par défaut Problème de Thread: Execution simultanée
    Bonjour

    Je tiens d'abord à dire que j'ai cherché et que peut être la réponse à mon problème est simple mais après plusieurs recherches je n'ai pas trouvé la réponse à mon problème ^^'

    Voilà j'exécute une fonction et mais lorsque j'exécute à nouveau cette fonction il subsiste des problèmes car si je réutilise ma fonction alors que l'utilisation précédente n'est pas terminée (la boucle n'est pas terminée en somme), elle m'affiche la valeur de endSong de la 1ère utilisation et la valeur de endSong de la deuxième utilisation --'

    Voilà le code (PS: j'ai enlevé les importations pour le raccourcir):
    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
    public class Test
    {    
        private static JFrame mainWindow;
        private static JButton button = new JButton("NEW");
        private static Thread a;
        private static JLabel c = new JLabel();
        private static JLabel d = new JLabel();
        private static JPanel z = new JPanel();
        private static int dureetotale;
        private static int curentposition;
     
        public static void main(String[] args)
        {
            mainWindow = new JFrame();
            mainWindow.setTitle("Test");
            mainWindow.setMinimumSize(new Dimension(800,600));
            mainWindow.setResizable(false);
            mainWindow.setLocationRelativeTo(null);
            mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            mainWindow.setExtendedState(JFrame.MAXIMIZED_BOTH);
            mainWindow.setLayout(new BorderLayout());
            z.setSize(new Dimension(800,600));
            z.add(c, BorderLayout.WEST);
            z.add(d, BorderLayout.EAST);
            button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { start(); } });
            z.add(button, BorderLayout.NORTH);
            mainWindow.setContentPane(z);
            mainWindow.setVisible(true);
        }
     
        public static void start() 
        {
            dureetotale = Integer.parseInt(JOptionPane.showInputDialog(mainWindow, null, "Durée en secondes", JOptionPane.PLAIN_MESSAGE));
     
            a = new Thread()
            {
                private int bmin;
                private int bsec;
                private String bsecf = null;
                private int emin;
                private int esec;
                private String esecf = null;
                private String beginSong = null;
                private String endSong = null;
     
                public void run()
                {
                    while(!(esec == 0 && emin == 0))
                    {
                        bmin = curentposition/60;
                        bsec = curentposition - 60*bmin;
     
                        if(bsec < 10) bsecf = "0" + bsec;
                        else bsecf = new String("" + bsec + "");
                        beginSong = new String(bmin + ":" + bsecf);
     
                        emin = dureetotale/60 - bmin;
                        esec = dureetotale - 60*emin - curentposition + 60;
                        if(esec < 60) emin = emin - 1; else esec = esec -60;
                        if(esec < 10) esecf = "0" + esec;
                        else esecf = new String("" + esec + "");
                        endSong = new String(emin + ":" + esecf);
     
                        c.setText(beginSong);
                        d.setText(endSong);
     
                        curentposition += 1;
     
                        try
                        {
                            Thread.sleep(1000);
                        }
                        catch( Exception ee )
                        {
                            ee.printStackTrace();
                        }
                    }
                }
            };
     
            a.start();
        }
    }
    Testez le code si je n'est pas été clair ^^' (Mettez par exemple 140 puis appuyez une nouvelle fois sur le bouton "NEW" et mettez 870)

    Merci d'avance de l'aide que les membres du forum m'apporteront

    Cordialement, Xavi91

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Salut,

    Ton probleme est que quand tu appuies sur ton bouton, tu crées un nouveau Thread qui s'execute parallelement aux précédents. Et comme ils utilisent tous le meme label, joliment nomé "c" et "d", ca pose probleme. Pour que ton programme marche, il faudrait arreter le thread precedent avant de lancer le nouveau.

    a+

  3. #3
    Membre à l'essai
    Homme Profil pro
    Rien
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Rien

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Finalement mon problème a été résolu sur un autre site, merci quand même aux membres du site qui ont essayé de m'aider

    Le code :
    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
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
     
    public class ThreadTest extends JFrame {
        public static void main(String[] args) {
    	@SuppressWarnings("unused")
    	ThreadTest r = new ThreadTest();
        }
     
        private MyThread t = new MyThread(0);
        private JButton button = new JButton("New");
        private JLabel labTimeLeft = new JLabel("0:00"), labTimePassed = new JLabel("0:00");
     
        public ThreadTest() {
    	setTitle("Display Time");
    	setMinimumSize(new Dimension(300,100));
    	setResizable(false);
    	setLocationRelativeTo(null);
    	setDefaultCloseOperation(EXIT_ON_CLOSE);
    	setLayout(new FlowLayout());
     
    	button.addActionListener(new ActionListener() {
    	    @Override
    	    public void actionPerformed(ActionEvent e) {
    		int time = Integer.parseInt(JOptionPane.showInputDialog("Enter a value"));
    		startThread(time);
    	    }
    	});
     
    	add(button);
    	add(labTimeLeft);
    	add(labTimePassed);
     
    	setVisible(true);
        }
     
        public void startThread(int time) {
    	t.stopThread();
    	t = new MyThread(time);
    	t.start();
        }
     
        class MyThread extends Thread {
    	private int timeLeft, timePassed;
    	private boolean running;
     
    	public MyThread(int s) {
    	    running = true;
    	    timeLeft = s;
    	    timePassed = 0;
    	}
     
    	public void run() {
    	    while(timeLeft >= 0 && running) {
    		labTimeLeft.setText(makeTime(timeLeft));
    		labTimePassed.setText(makeTime(timePassed));
    		timeLeft--;
    		timePassed++;
    		try {
    		    Thread.sleep(1000);
    		} catch(InterruptedException e) {}
    	    }
    	}
    	public String makeTime(int sec) {
    	    String min = (int)(Math.floor(sec/60)) + "";
    	    String seconds = ((sec%60) >= 10 ? "" : "0") + (sec%60);
    	    return min + ":" + seconds;
    	}
    	public void stopThread() {
    	    running = false;
    	}
        }
    }

  4. #4
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Oui, c'est une technique souvent utilisée. Au passage, pour aller jusqu'au bout, tu peux faire un thread.join pour attendre que le thread soit arreté avant de lancer le nouveau. Parce que quand tu fais le stop, le thread n'est pas terminé de maniere synchrone (autrement dit, quand ta fonction revient, le thread tourne toujours).

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

Discussions similaires

  1. probléme dans l'execution du Thread
    Par Etudiante_Ines dans le forum Général Java
    Réponses: 3
    Dernier message: 12/03/2012, 19h38
  2. [VB.NET] Problème de Thread
    Par Sadneth dans le forum ASP.NET
    Réponses: 26
    Dernier message: 31/01/2006, 11h12
  3. Problème synchronisation threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 19
    Dernier message: 11/01/2006, 17h57
  4. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 11h51
  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, 23h22

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