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

NetBeans Java Discussion :

Arrêter un thread boutton


Sujet :

NetBeans Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut Arrêter un thread boutton
    Bonjour j'ai un thread qui est lancé ( run() ) grâce à l'action d'un bouton , je voudrai que ce thread soit arrêter par l'action d'un autre bouton comment procéder à cet arrêt ?

    Pour lancer le thread ,bouton Lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void lectureActionPerformed(java.awt.event.ActionEvent evt) {                                        
            // création d'une instance du Thread
            thread = new UnThread(nomChanson.getText());
            // Activation du Thread
            thread.start();
        }
    le thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class UnThread extends Thread{
     
        private String chemin;
     
        UnThread(String text) {
           chemin=text;
        }
        @Override
      public void run() {
            Sound player = new Sound(chemin);
            InputStream stream = new ByteArrayInputStream(player.getSamples());
            player.play(stream);
      }
    }
    Je sais que destroy() peut détruire le thread mais vu que cet destruction se fait dans une autre classe, je ne vois pas comment il sait lequel thread il faut détruire . Noter que le bouton Stop se situe dans la même classe que le bonton Lecture
    Le temps est le pire enemi de l'homme

  2. #2
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Citation Envoyé par lerorodu51 Voir le message
    je ne vois pas comment il sait lequel thread il faut détruire
    ça, c'est à toi de construire ton application pour qu'il le sache...

    destroy est deprecated, stop également... donc à éviter.

    Une méthode propre est de changer d'état un boolean, et de vérifier l'état de ce boolean depuis la méthode play de ton player. Si c'est vrai, ça continue à jouer, si c'est faux, ça arrête la lecture.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut
    Oui je suis d'accord avec toi mais cela ne m'aide pas . Je ne vois pas comment atteindre un thread déclaré dans un bouton depuis un autre bouton pour lui envoyer par exemple un booléen .
    Le temps est le pire enemi de l'homme

  4. #4
    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
    tu dois stocker la référence au thread créé dans un endroit accessible depuis tes deux action.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut
    Voilà j'ai suivi tes conseils et j'ai réussi à arrêter ma musique, mais le fait d'arrêter la musique n'a pas détruit le thread donc je ne peux pas reprendre la lecture car problème suivant :
    Le temps est le pire enemi de l'homme

  6. #6
    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
    si tu sort de ton run, le thread a terminé. Il n'y a pas de notion de "destruction" de Thread en java autre que le garbage collector comme pour tout objet java. Pour ton problème de Heap space, quelle est la tailel de ton application? Est-ce une petite application, une grosse application? Sort tu bien de to run()? Pourrais-tu nous donner le message complet de l'erreur que tu as, y compris son stacktrace.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut
    Erreur :
    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
    run:
    Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
            at lecteurmusique.Sound.getSamples(Sound.java:41)
            at lecteurmusique.Sound.<init>(Sound.java:30)
            at lecteurmusique.UnThread.<init>(UnThread.java:20)
            at lecteurmusique.Lecteur.lectureActionPerformed(Lecteur.java:137)
            at lecteurmusique.Lecteur.access$100(Lecteur.java:20)
            at lecteurmusique.Lecteur$2.actionPerformed(Lecteur.java:51)
            at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
            at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
            at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
            at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
            at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
            at java.awt.Component.processMouseEvent(Component.java:6038)
            at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
            at java.awt.Component.processEvent(Component.java:5803)
            at java.awt.Container.processEvent(Container.java:2058)
            at java.awt.Component.dispatchEventImpl(Component.java:4410)
            at java.awt.Container.dispatchEventImpl(Container.java:2116)
            at java.awt.Component.dispatchEvent(Component.java:4240)
            at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
            at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
            at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
            at java.awt.Container.dispatchEventImpl(Container.java:2102)
            at java.awt.Window.dispatchEventImpl(Window.java:2429)
            at java.awt.Component.dispatchEvent(Component.java:4240)
            at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
            at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
            at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
            at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
    Le code pour mettre fin à mon run (FAQ) :
    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
    public class UnThread extends Thread{
     
        private String chemin;
        protected volatile boolean running = true;
        Sound player;
        private boolean stopThread = false;
     
        UnThread(String text) {
           chemin=text;
           player = new Sound(chemin);
        }
     
        @Override
      public void run() {
     
            running=false;
            boolean fin = false;
     
            while( !fin ) {
     
                            //lit la musique
                             InputStream stream = new ByteArrayInputStream(player.getSamples());
                              player.play(stream);
     
                            synchronized(this) {
                                    Thread.yield();
                                    // lecture du boolean
                                    fin = this.stopThread;
                            }
            }
      }
     
        public synchronized void stop_thread() {
            this.stopThread = true;
           player.stop();
     
        }
    Le problème est que le code qu'il y a dans le while ne s'effectue qu'une fois donc le fait d'appeler stop_thread() n'influera pas sur le run qui ne revérifiera pas si stopthread =true .
    Le temps est le pire enemi de l'homme

  8. #8
    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
    Citation Envoyé par lerorodu51 Voir le message

    Le problème est que le code qu'il y a dans le while ne s'effectue qu'une fois donc le fait d'appeler stop_thread() n'influera pas sur le run qui ne revérifiera pas si stopthread =true .
    Donc ton arret ne fonctionne pas. Je sais pas quelle est cette classe sound, mais tu dois fournir un moyen pour qu'elle retourne dans ton run() après l'appel à stop_thread. Tant que cette classe ne retourne pas, ton test ne sert à rien et tes threads vont tous continuer.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut
    La classe Sound : (pour te renseigner)
    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
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package lecteurmusique;
     
     
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
     
    import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.DataLine;
    import javax.sound.sampled.LineUnavailableException;
    import javax.sound.sampled.SourceDataLine;
     
    class Sound {
        private AudioFormat format;
        private SourceDataLine line;
    	private byte[] samples;
     
    	public Sound(String filename) {
    		try {
    			AudioInputStream stream = AudioSystem.getAudioInputStream(new File(filename));
    			format = stream.getFormat();
    			samples = getSamples(stream);
    		} catch (Exception e) {
    		}
    	}
     
    	public byte[] getSamples() {
    		return samples;
    	}
     
    	public byte[] getSamples(AudioInputStream stream) {
    		int length = (int) (stream.getFrameLength() * format.getFrameSize());
    		byte[] samples = new byte[length];
    		DataInputStream in = new DataInputStream(stream);
    		try {
    			in.readFully(samples);
    		} catch (Exception e) {
    		}
    		return samples;
    	}
     
    	public void play(InputStream source) {
     
                    int bufferSize = format.getFrameSize() * Math.round(format.getSampleRate() / 10);
                    byte[] buffer = new byte[bufferSize];
                    try {
                        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
                        line = (SourceDataLine) AudioSystem.getLine(info);
                        line.open(format, bufferSize);
                    } catch (LineUnavailableException e) {
                        e.printStackTrace();
                        return;
                    }
                        line.start();
                        try {
                            int numBytesRead = 0;
                            while (numBytesRead != -1) {
                                numBytesRead = source.read(buffer, 0, buffer.length);
                                if (numBytesRead != -1)
                                    line.write(buffer, 0, numBytesRead);
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        // mise en file d'attente des données de la ligne par l'entrée-sortie de
                        //données ininterrompue tant que les données ne sont pas vides
                        line.drain();
                    line.close();
    	}
     
        public void stop() {
            line.close();
        }
     
     
    }
    Le temps est le pire enemi de l'homme

  10. #10
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Points : 57
    Points
    57
    Par défaut
    si tu as qu'un seul thread déclare le comme static ça t'évitera les prb de référence.


    Sinon je te conseille vivement d'opter pour la solution du boolean car ça t'evitera tout les soucis de mémoire

  11. #11
    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
    ta boucle while ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                            while (numBytesRead != -1) {
                                numBytesRead = source.read(buffer, 0, buffer.length);
                                if (numBytesRead != -1)
                                    line.write(buffer, 0, numBytesRead);
                            }
    tu ne va jamais en sortir, même après un line.close(). Tu dois mettre un flag à false dans ton player lors du stop() et tester ce flag dans ta boucle!

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (numBytesRead != -1 || arret==false) {
                                numBytesRead = source.read(buffer, 0, buffer.length);
                                if (numBytesRead != -1)
                                    line.write(buffer, 0, numBytesRead);
                            }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void stop() {
            line.close();
            arret=true;
        }
    C'est sa ?
    Le temps est le pire enemi de l'homme

  13. #13
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Jette un oeil là bas:
    http://java.sun.com/docs/books/tutor...interrupt.html

    Tu peux utiliser la méthode interrupt() pour arrêter ton thread et tester dans ta boucle la valeur de interrupted().

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut
    Désolé mais là je suis complétement largé. Je ne vois pas dans ton lien où il utilise le ".interupt()" .
    Le temps est le pire enemi de l'homme

  15. #15
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    C'est à toi d'appeler cette méthode sur ton thread quand tu as décidé de l'arrêter.

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void stopActionPerformed(java.awt.event.ActionEvent evt) {                                     
            thread.stop_thread();
            thread.interrupt();
    }
    Toujours la même erreur.Je suis désolé je suis pas vraiment assidu ^^
    Le temps est le pire enemi de l'homme

  17. #17
    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
    fr1man: l'appel à interrupt() n'est utile que sur les opérations blocantes le gérant. Si son implémentation de inputstream n'est pas blocante (par exemple un ByteArrayOutputStream), le interruptedException ne sera jamais déclenché!



    lerorodu51: ton code testant le flag dans player devrait à priori fonctionner comem montré. Sauf si tu reste bloqué 2 heure dans source.read ou line.write, dans ce dernier cas, il reste à tenter le interrupt() pour forcer le débloquage.

  18. #18
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Je n'ai pas dit d'utiliser interrupt() tout seul.
    J'ai dit aussi d'utiliser interrupted() (dans la boucle de sa méthode play) pour stopper son thread.
    Je ne vois pas le problème.

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut
    Sauf si tu reste bloqué 2 heure dans source.read ou line.write, dans ce dernier cas, il reste à tenter le interrupt() pour forcer le débloquage.
    Ben disons qu'il lit une musique donc sa dure le temps de la musique. Le truc c'est que la musique je l'arrête bien mais le thread est toujours présent.Il faudrait qu'après avoir arrêter la musique je retourne dans le run pour que le thread se supprime comme le disait Fr1man.

    je vois que mon problème pose problème . Si ça peut vous aidez http://dl.free.fr/q1hpv9D38
    Le temps est le pire enemi de l'homme

  20. #20
    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
    si le son s'arrête bien, c'est que le write sur le line ne font plus rien, donc si tu sort bien de ta boucle qui fait les write, il ne devrait plus y avoir de soucis.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Arrêter un thread en python ?
    Par fanou31 dans le forum Général Python
    Réponses: 7
    Dernier message: 23/06/2013, 18h15
  2. Réponses: 2
    Dernier message: 05/10/2006, 17h56
  3. [Thread] arrêter un thread
    Par melvar dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 10/04/2006, 18h06
  4. Réponses: 18
    Dernier message: 06/04/2005, 14h09
  5. Arrêter une Thread brutalement!
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 21h29

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