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 :

Java : Interrompre la lecture d'un fichier .wav


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Octobre 2023
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2023
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Java : Interrompre la lecture d'un fichier .wav
    Bonjour,
    le but de ma classe Demarrer4 est d'afficher deux bouton (Démarrer, Arrêter) dans une fenêtre. Si on clique sur démarre la music se lance et si on clique sur arrêter la musique s'arrête. En parallèle je fais afficher un texte défilant en haut a gauche de la fenêtre afin de m'assurer que le thread continue de tourner.

    La version que je vous donne en exemple, lance la musique mais impossible de l'arrêter et si on reclique sur démarrer on lance une deuxième musique qui vient se superposer sur la première etc .... De plus le texte ne défile pas.

    Si je mets en commentaire la ligne
    this.musique.run();
    je n'ai plus de musique (normale) et le texte défile bien et s'arrête quand on clique sur arrêter et redémarre quand on clique sur démarrer.

    Je vous remercie de votre aide , car après des heures de recherches je n'y arrive pas.

    Merci pour vos réponses.

    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
    package othello;
     
    import java.awt.BorderLayout;
    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.JPanel;
     
    public class Demarrer4 extends JFrame implements ActionListener{
        protected JButton demarrer = new JButton("Démarrer");
        protected JButton arreter = new JButton("Arrêter");
        protected JLabel message = new JLabel("Message Test");
        protected JPanel panel = new JPanel(new FlowLayout());
        protected volatile boolean running = false;
        protected AePlayWave playWaveMusic=new AePlayWave("musique.wav");
        protected int nbThreads=0;
     
     
     
        public Demarrer4(){
            setTitle("Message");
            this.setSize(200, 150);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLayout(new BorderLayout(1,2));
            panel.add(demarrer);
            panel.add(arreter);
            this.add(message, BorderLayout.NORTH);
            this.add(panel, BorderLayout.SOUTH);
            demarrer.addActionListener(this);
            arreter.addActionListener(this);
            this.setVisible(true);
     
        }
     
     
     
        public void actionPerformed(java.awt.event.ActionEvent event) {
     
            Object source = event.getSource();
     
     
            if(source == demarrer) {
                running = true;
                Thread thread = new Thread(new MonRunnable(playWaveMusic));
                thread.start();
     
                nbThreads++;
     
                System.out.println("Nombre de threads = "+nbThreads);
                System.out.println("ID thread = "+thread.getId());
     
     
     
            } else if(source == arreter) {
                //cancel();
                running = false;
                //this.playWaveMusic.interrupt();
                //thread.suspend();
     
            }
     
        }
    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
    class MonRunnable extends Thread implements Runnable  {
            AePlayWave musique;
     
            public MonRunnable(AePlayWave music) {
                this.musique = music;
     
            }
     
            public void cancel() {
     
                   // interruption du thread courant, c'est-à-dire le nôtre
                  Thread.currentThread().interrupt() ;
     
               }
     
            public void run() {
     
     
     
                while (running){
                    try{
                        //if (!musique.isAlive()) musique.start();
                        //System.out.println("running = "+running);
                        String texte = message.getText();
                        String debut = texte.substring(0, texte.length()-1);
                        String fin = texte.substring(texte.length()-1);    
                        texte = fin+debut;
                        message.setText(texte);
                        this.musique.run();
                        Thread.sleep(100);
     
                    }catch (InterruptedException e) {
                        running = false;
                        this.musique.interrupt();
                        this.cancel();
     
                        //Thread.currentThread().interrupted() ;
                        }
                }
     
     
     
            }
     
        }
     
        public static void main(String[] args) {
            // TODO Auto-generated method stub
     
            Demarrer4 action = new Demarrer4();
     
        }
     
     
     
     
     
     
    }

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5
    Par défaut
    Je ne vais pas répondre à la question mais faire des remarques.

    Déjà, on utilise le "code balise" comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public MaClasse{
     
    }
    Et on n'oublie pas l'indentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    public MaClasse{
      public void maMethode(){
     
      }
    }
    Si c'est lisible, on prendra peut-être la peine de lire le code.

    Ensuite, on différentie le rôle des classe selon le principe SOLID (S de SOLID).
    https://fr.wikipedia.org/wiki/SOLID_%28informatique%29

    Il faut donc une seule classe pour la lecture.
    Le mieux est de définir le contrat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface FichierWav{
      void start();
     
      void stop();
    }
    Note qu'en réalité, il peut y avoir diverses exceptions lancées, et qu'il faudrait les spécifier dans le contrat.

    A l'extérieur, on ne voit que le contrat, et on n'a pas à savoir comment ça marche.

    Le contrat s'éxécute effectivement dans un Thread indépendant.

    Là aussi, la programmation concurrente, c'est un peu compliqué.
    Le plus important, c'est de différentier la tache (Runnable) et l’exécution de la tâche.
    Pour cela, on utilise le frameword exécutor.
    https://www.jmdoudoux.fr/java/dej/chap-executor.htm

    Donc l'implémentation devient:
    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
     
    public class FichierWavImpl implements FichierWav, Runnable{
     
      private boolean isReading;
     
      private ExecutorService executorService;
     
      public FichierWavImpl(){
        isReading = false;
      }
     
      @Override
      public void run(){
          while(isReading){
             //Code de lecture
          }
      }
     
      @Override
      public void start(){
          if(!isReading){
              isReading = true;
              executorService = Executors.newSingleThreadExecutor();
              executorService.execute(this);
          }
      }
     
      public void stop(){
          if(isReading){
              isReading = false;
              executorService.shutdown();
          }
      }
    }
    Ensuite, reste à faire l'IHM. L'IHM utilise le principe d'injection de dépendance (le D de SOLID).

    en résumé, l'IHM ne peut fonctionner que si on injecte le fichier WAV.
    Donc en résumé,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class MonIHM{
     
       private final FichierWav fichierWav;
     
       public FichierWav(FichierWav fichierWav){
         this.fichierWav = fichierWav;
      }
     
      //Le code pour construire l'IHM
    }
    On note que l'IHM ne voit que un contrat, qu'il peut start ou stop.

    Pour rappel, les boutons sont basés sur le Design pattern Observer/Observable:
    https://fr.wikipedia.org/wiki/Observ...de_conception)

    On n'a plus que à ajouter l'action aux boutons.
    Notez que l'on peut d'ailleurs en ajouter plusieurs.

    On va utiliser, pour la lisibilité du code, les lambda expressions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    boutonStart.addActionListener(e -> fichierWav.start())

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    boutonStop.addActionListener(e -> fichierWav.stop())

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5
    Par défaut
    De plus, il n'est pas recommandé d'utiliser la méthode interrupt() des thread.

    Il faut le faire par else/if/while...

    En gros, mettre un boolean à false.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while(isReading){
      //Code de lecture
    }
    Et s'arranger de l'extérieur pour mettre ce booléen à false.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Octobre 2023
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2023
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par PhilippeGibault Voir le message
    Je ne vais pas répondre à la question mais faire des remarques.

    Déjà, on utilise le "code balise" comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public MaClasse{
     
    }
    Et on n'oublie pas l'indentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    public MaClasse{
      public void maMethode(){
     
      }
    }
    Si c'est lisible, on prendra peut-être la peine de lire le code.

    Ensuite, on différentie le rôle des classe selon le principe SOLID (S de SOLID).
    https://fr.wikipedia.org/wiki/SOLID_%28informatique%29

    Il faut donc une seule classe pour la lecture.
    Le mieux est de définir le contrat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface FichierWav{
      void start();
     
      void stop();
    }
    Note qu'en réalité, il peut y avoir diverses exceptions lancées, et qu'il faudrait les spécifier dans le contrat.

    A l'extérieur, on ne voit que le contrat, et on n'a pas à savoir comment ça marche.

    Le contrat s'éxécute effectivement dans un Thread indépendant.

    Là aussi, la programmation concurrente, c'est un peu compliqué.
    Le plus important, c'est de différentier la tache (Runnable) et l’exécution de la tâche.
    Pour cela, on utilise le frameword exécutor.
    https://www.jmdoudoux.fr/java/dej/chap-executor.htm

    Donc l'implémentation devient:
    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
     
    public class FichierWavImpl implements FichierWav, Runnable{
     
      private boolean isReading;
     
      private ExecutorService executorService;
     
      public FichierWavImpl(){
        isReading = false;
      }
     
      @Override
      public void run(){
          while(isReading){
             //Code de lecture
          }
      }
     
      @Override
      public void start(){
          if(!isReading){
              isReading = true;
              executorService = Executors.newSingleThreadExecutor();
              executorService.execute(this);
          }
      }
     
      public void stop(){
          if(isReading){
              isReading = false;
              executorService.shutdown();
          }
      }
    }
    Ensuite, reste à faire l'IHM. L'IHM utilise le principe d'injection de dépendance (le D de SOLID).

    en résumé, l'IHM ne peut fonctionner que si on injecte le fichier WAV.
    Donc en résumé,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class MonIHM{
     
       private final FichierWav fichierWav;
     
       public FichierWav(FichierWav fichierWav){
         this.fichierWav = fichierWav;
      }
     
      //Le code pour construire l'IHM
    }
    On note que l'IHM ne voit que un contrat, qu'il peut start ou stop.

    Pour rappel, les boutons sont basés sur le Design pattern Observer/Observable:
    https://fr.wikipedia.org/wiki/Observ...de_conception)

    On n'a plus que à ajouter l'action aux boutons.
    Notez que l'on peut d'ailleurs en ajouter plusieurs.

    On va utiliser, pour la lisibilité du code, les lambda expressions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    boutonStart.addActionListener(e -> fichierWav.start())

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    boutonStop.addActionListener(e -> fichierWav.stop())
    Oui merci pour tes commentaires, j'ai contourné le probleme en utilisant une autre Classe
    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
     
     
    package othello;
     
    import java.io.File;
     
    import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.Clip;
    import javax.sound.sampled.DataLine;
     
     
    public class WavPlayer {    
     
        private Clip clip = null;
        private AudioInputStream audioStream = null;
     
        public WavPlayer(File f) throws Exception{
            audioStream = AudioSystem.getAudioInputStream(f);//recuperation d'un stream de type audo sur le fichier
            AudioFormat audioFormat = audioStream.getFormat();//recuperation du format de son
            //recuperation du son que l'on va stoquer dans un oblet de type clip
            DataLine.Info info = new DataLine.Info(
                    Clip.class, audioStream.getFormat(),
                    ((int) audioStream.getFrameLength() * audioFormat.getFrameSize()));
            //recuperation d'une instance de type Clip
            clip = (Clip) AudioSystem.getLine(info);
     
        }
     
        /**
         * Ouverture du flux audio
         * @return On retourne <code>false
        si il y a eu une erreure
         */
     
        public boolean open(){
            if(clip != null && !clip.isOpen())//teste pour ne pas le faire dans le vent
                try {
                    clip.open(audioStream);
                } catch (Exception e) {
                    e.printStackTrace();//pour le debugage
                    return false;
                }
            return true;
        }
        /**
         * Fermeture du flux audio
         */
        public void close(){
            if(clip != null && clip.isOpen())//teste pour ne pas le faire dans le vent
                clip.close();
        }
     
        /**
         * On joue le son
         */
        public void play(){
            if(clip != null && clip.isOpen())
                clip.start();
        }
     
        /**
         * On arrete le son
         */
        public void stop(){
            if(clip != null && clip.isOpen())
                clip.stop();
        }
     
        public static void main(String [] args){
            try {
                WavPlayer wp = new WavPlayer(new File("vague.wav"));
                wp.open();//ouverture du flux
                wp.play();//lecture
                for (int i=0; i<=1000000;i++)System.out.println("i = "+i);
                wp.stop();//arret
                for (int i=0; i<=1000000;i++)System.out.println("i = "+i);
                wp.play();//lecture
                for (int i=0; i<=1000000;i++)System.out.println("i = "+i);
     
                wp.close();//pour etre propre on ferme le flux quand il n'est plus utile :D
            } catch (Exception e) {
                e.printStackTrace();
            }
     
        }
    }
    nonobstant je ne comprends pas pkoi mes thread ne fonctionne 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
    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    package othello;
     
    import java.awt.BorderLayout;
    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.JPanel;
     
    public class Demarrer4 extends JFrame implements ActionListener{
    	protected JButton demarrer = new JButton("Démarrer");
    	protected JButton arreter = new JButton("Arrêter");
    	protected JLabel message = new JLabel("Message Test");
    	protected JPanel panel = new JPanel(new FlowLayout());
    	protected volatile boolean running = false;
    	protected AePlayWave playWaveMusic=new AePlayWave("musique.wav");
    	protected int nbThreads=0;
     
     
     
    	public Demarrer4(){
    		setTitle("Message");
    		this.setSize(200, 150);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setLayout(new BorderLayout(1,2));
    		panel.add(demarrer);
    		panel.add(arreter);
    		this.add(message, BorderLayout.NORTH);
    		this.add(panel, BorderLayout.SOUTH);
    		demarrer.addActionListener(this);
    		arreter.addActionListener(this);
    		this.setVisible(true);
     
    	}
     
     
     
    	public void actionPerformed(java.awt.event.ActionEvent event) {
     
    		Object source = event.getSource();
     
     
    		if(source == demarrer) {
    			running = true;
    			Thread thread = new Thread(new MonRunnable(playWaveMusic));
    			thread.start();
     
    			nbThreads++;
     
    			System.out.println("Nombre de threads = "+nbThreads);
    			System.out.println("ID thread = "+thread.getId());
     
     
     
    		} else if(source == arreter) {
    			//cancel();
    			running = false;
    			//this.playWaveMusic.interrupt();
    			//thread.suspend();
     
    		}
     
    	}
     
    	class MonRunnable extends Thread implements Runnable  {
    		AePlayWave musique;
     
    		public MonRunnable(AePlayWave music) {
    			this.musique = music;
     
    		}
     
    		public void cancel() {
     
    		       // interruption du thread courant, c'est-à-dire le nôtre
    		      Thread.currentThread().interrupt() ;
     
    		   }
     
    	    public void run() {
     
     
     
    			while (running){
    				try{
    					//if (!musique.isAlive()) musique.start();
    					//System.out.println("running = "+running);
    					String texte = message.getText();
    					String debut = texte.substring(0, texte.length()-1);
    					String fin = texte.substring(texte.length()-1);	
    					texte = fin+debut;
    					message.setText(texte);
    					this.musique.run();
    					Thread.sleep(100);
     
    				}catch (InterruptedException e) {
    					running = false;
    					this.musique.interrupt();
    					this.cancel();
     
    					//Thread.currentThread().interrupted() ;
    					}
    			}
     
     
     
    	    }
     
    	}
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		Demarrer4 action = new Demarrer4();
     
    	}
     
     
     
     
     
     
    }
     
     
     
     
     
     
     
     
     
     
     
    [

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5
    Par défaut
    Je pense qu'il y a sincèrement un problème de conception.

    Lire le fichier, c'est un problème.

    Afficher le merdier, c'est un autre problème qui n'a rien à voir avec le premier problème.

    D'abord on règle le problème de la lecture de fichier, ensuite on s'occupe de l'affichage (qui nécessite le fichier, dont injection de dépendance).

    En général, Single Responsability (S de SOLID), 1 problème = 1 classe.

    Pour l'IHM, c'est plus simple si on a:
    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
     
    public class Demarrer4 extends JFrame{
     
            private final FichierWAV fichierWAV;
     
            private JButton demarrer = new JButton("Démarrer");
    	private JButton arreter = new JButton("Arrêter");
    	private JLabel message = new JLabel("Message Test");
    	private JPanel panel = new JPanel(new FlowLayout());
     
     
     
    	public Demarrer4(FichierWAV fichierWAV){
     
                   this.fichierWAV = fichierWAV;
     
    		setTitle("Message");
    		this.setSize(200, 150);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setLayout(new BorderLayout(1,2));
    		panel.add(demarrer);
    		panel.add(arreter);
    		this.add(message, BorderLayout.NORTH);
    		this.add(panel, BorderLayout.SOUTH);
    		demarrer.addActionListener(e -> fichierWAV.start());
    		arreter.addActionListener(e -> fichierWAV.stop());
    		this.setVisible(true);
     
    	}
     
    }
    Moins de ligne de codes, plus simple à comprendre, et là, on ne règle que le problème de l'affichage (qui je rappelle n'a rien à voir avec la lecture du dit-fichier).

    Reste à effectivement régler cette dite lecture qui a effectivement la vraie difficulté.

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5
    Par défaut
    Pour la lecture du fichier, une remaque globale: On ferme tous les flux (Inputsream, outputstream...).

    Soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    try(audioStream = AudioSystem.getAudioInputStream(f)){
      //Traitement
    }
    Evidement, comme on s'adresse à l'extérieur, on a toujours un contrat (pour l'extérieur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface FichierWav{
      void start();
     
      void stop();
    }
    L'extérieur ne voit que un contrat. Ce contrat s'exécute effectivement dans un Thread à part. Mais ça, l'extérieur n'a pas à le savoir. Il ne doit surtout pas le savoir.

    On a aussi une tache. Donc l'implémentation implémente le contrat défini, pour l'extérieur, mais aussi runnable, pour un futur Thread.

    Je vais préciser l'implémentation avec les nouvelles données.

    Pour que le contrat fonctionne, il faut effectivement un fichier (donné également par injection de dépendance).
    Soit:
    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
     
    public class FichierWavImpl implements FichierWav, Runnable{
     
      private final File fichierWAV;//Pour fonctionner
     
      private ExecutorService executorService;//Pour lancer le Thread
     
      private boolean isReading;//Suis-je en train de lire
     
      public FichierWavImpl(File fichierWAV){
        this. = fichierWAV;
      }
     
      @Override //Rappel: On surcharge. On donne une implémentation, ici pour Runnable
      public void run(){
        try(audioStream = AudioSystem.getAudioInputStream(f)){//Ouverture du flux, utilisation du try-with-ressource pour le fermer automatiquement une fois le traitement fini
           while(isReading){ //Je continue le traitement que si je lis
              //Ecrire le traitement
           }
        }
      }
     
      //Maintenant, pour l'extérieur
      @Override
      public void start(){
        if(!isReading){//Appeler cette méthode  n'a de sens que si on n'est pas en lecture
          isReading = true;//On passe en mode lecture
          executorService = Executors.newSingleThreadExecutor();// On implémente la classe qui va permettre de lancer la tâche dans un Thread séparé.
          executorService.execute(this);//On exécute la tâche dans un Thread séparé. A noté que l'on a déporté encore la gestion du thread (et les difficulté inhérente ailleurs). C'est encore une application de SOLID.
        }
      }
     
      @Ovveride
      public void stop(){
        if(isReading){//N'a de sens que si on lit
          isReading = false;//On change l'état, notament pour la méthode run, et arrêter la méthode run.
          executorService.shutdown();//On ferme l'exécutor.
        }
      }
    }
    Évidemment, le code est améliorable, vu que ExecutorService est Autoclosable:
    https://docs.oracle.com/en/java/java...orService.html

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5
    Par défaut
    Amélioration:
    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
     
     
    public class FichierWavImpl implements FichierWav, Runnable{
     
      private final File fichierWAV;//Pour fonctionner
     
      private boolean isReading;//Suis-je en train de lire
     
      public FichierWavImpl(File fichierWAV){
        isReading = false;
        this. = fichierWAV;
      }
     
      @Override //Rappel: On surcharge. On donne une implémentation, ici pour Runnable
      public void run(){
        try(audioStream = AudioSystem.getAudioInputStream(fichierWAV)){//Ouverture du flux, utilisation du try-with-ressource pour le fermer automatiquement une fois le traitement fini
           while(isReading){ //Je continue le traitement que si je lis
              //Ecrire le traitement
           }
        }
      }
     
      //Maintenant, pour l'extérieur
      @Override
      public void start(){
        if(!isReading){//Appeler cette méthode  n'a de sens que si on n'est pas en lecture
          isReading = true;//On passe en mode lecture
          try(ExecutorService executorService = Executors.newSingleThreadExecutor(){// On implémente la classe qui va permettre de lancer la tâche dans un Thread séparé.
            executorService.execute(this);//On exécute la tâche dans un Thread séparé. A noté que l'on a déporté encore la gestion du thread (et les difficulté inhérente ailleurs). C'est encore une application de SOLID.
          }
        }
      }
     
      @Ovveride
      public void stop(){
          isReading = false;//On change l'état, notament pour la méthode run, et arrêter la méthode run.
        }
      }
    }

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Octobre 2023
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2023
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Bien je ne sais pas mettre ou et quoi ? dans quels fichiers ? et ou est le main ?
    Citation Envoyé par PhilippeGibault Voir le message
    Amélioration:
    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
     
     
    public class FichierWavImpl implements FichierWav, Runnable{
     
      private final File fichierWAV;//Pour fonctionner
     
      private boolean isReading;//Suis-je en train de lire
     
      public FichierWavImpl(File fichierWAV){
        isReading = false;
        this. = fichierWAV;
      }
     
      @Override //Rappel: On surcharge. On donne une implémentation, ici pour Runnable
      public void run(){
        try(audioStream = AudioSystem.getAudioInputStream(fichierWAV)){//Ouverture du flux, utilisation du try-with-ressource pour le fermer automatiquement une fois le traitement fini
           while(isReading){ //Je continue le traitement que si je lis
              //Ecrire le traitement
           }
        }
      }
     
      //Maintenant, pour l'extérieur
      @Override
      public void start(){
        if(!isReading){//Appeler cette méthode  n'a de sens que si on n'est pas en lecture
          isReading = true;//On passe en mode lecture
          try(ExecutorService executorService = Executors.newSingleThreadExecutor(){// On implémente la classe qui va permettre de lancer la tâche dans un Thread séparé.
            executorService.execute(this);//On exécute la tâche dans un Thread séparé. A noté que l'on a déporté encore la gestion du thread (et les difficulté inhérente ailleurs). C'est encore une application de SOLID.
          }
        }
      }
     
      @Ovveride
      public void stop(){
          isReading = false;//On change l'état, notament pour la méthode run, et arrêter la méthode run.
        }
      }
    }

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Octobre 2023
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2023
    Messages : 13
    Points : 6
    Points
    6
    Par défaut erreur :
    try(audioStream = AudioSystem.getAudioInputStream(fichierWAV)){

    Description Resource Path Location Type
    audioStream cannot be resolved to a type FichierWavImpl.java /JeuOthello/src/othello line 24 Java Problem

    Description Resource Path Location Type
    Syntax error on token "audioStream", VariableDeclaratorId expected after this token FichierWavImpl.java /JeuOthello/src/othello line 24 Java Problem

    et je suppose que c'et : this.fichierWAV = fichierWAV; il manquait qq chose apres le this

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Octobre 2023
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2023
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Bonsoir suite .....
    Voila après qq recherches je peux maintenant exécuter les codes que vous m'avez conseillés, le fichier "musique.wav" ne se lis pas

    Mais je ne vois pas ou le fichier "musique.wav" est lu ou devrait etre lu, et je ne comprends pas ce que fais l'instruction executorService.execute(this);

    Merci pour votre réponse.
    Salutations

    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
     
     
    package othello;
     
    import java.io.File;
    import java.io.IOException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
     
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.UnsupportedAudioFileException;
     
    public class FichierWavImpl implements FichierWav, Runnable{
     
      private final File fichierWAV;//Pour fonctionner
     
      private ExecutorService executorService;//Pour lancer le Thread
     
      private boolean isReading=false;  //Suis-je en train de lire
     
      public FichierWavImpl(File fichierWAV){
        this.fichierWAV = fichierWAV;
      }
     
      //Rappel: On surcharge. On donne une implémentation, ici pour Runnable
     
     
     
      public void run(){
     
     
     
    	  AudioInputStream audioInputStream = null;
    	  try{
    	  			//obtention d'un flux audio à partir d'un fichier (objet File)
    	       audioInputStream = AudioSystem.getAudioInputStream(fichierWAV);
    	       System.out.println("run lancé");
     
    	       int i =0;
    	       //WavPlayer wp = new WavPlayer(new File("vague.wav"));
    	       while(isReading){ 
    	     	   i++;
    	     	   //Je continue le traitement que si je lis
    	           //Ecrire le traitement
     
    	    	   System.out.println("compteur = "+i);
    	    	   Thread.sleep(1000);
    	        }
     
    	     } catch (UnsupportedAudioFileException e) {
    	         	e.printStackTrace();
    	           return;
    	     } catch (IOException e) {
    	             e.printStackTrace();
    	             return;
    	     } catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
      }
     
      //Maintenant, pour l'extérieur
     
      public void start(){
     
    	System.out.println("Debut de start");
        if(!isReading){//Appeler cette méthode  n'a de sens que si on n'est pas en lecture
          isReading = true;//On passe en mode lecture
     
          executorService = Executors.newSingleThreadExecutor();// On implémente la classe qui va permettre de lancer la tâche dans un Thread séparé.
          executorService.execute(this);//On exécute la tâche dans un Thread séparé. A noté que l'on a déporté encore la gestion du thread (et les difficulté inhérente ailleurs). C'est encore une application de SOLID.
        }
      }
     
     
      public void stop(){
    	  System.out.println("Debut de stop");
     
        if(isReading){//N'a de sens que si on lit
          isReading = false;//On change l'état, notament pour la méthode run, et arrêter la méthode run.
          executorService.shutdown();//On ferme l'exécutor.
        }
      }
    }
    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
     
    package othello;
     
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
     
    import othello.Demarrer4.MonRunnable;
     
    public class Demarrer5 extends JFrame{
     
        private final FichierWavImpl fichierWAV;
     
        private JButton demarrer = new JButton("Démarrer");
        private JButton arreter = new JButton("Arrêter");
        private JLabel message = new JLabel("Message Test");
        private JPanel panel = new JPanel(new FlowLayout());
     
     
     
    public Demarrer5(FichierWavImpl fichierWAV){
     
        this.fichierWAV = fichierWAV;
     
    	setTitle("Message");
    	this.setSize(200, 150);
    	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	setLayout(new BorderLayout(1,2));
    	panel.add(demarrer);
    	panel.add(arreter);
    	this.add(message, BorderLayout.NORTH);
    	this.add(panel, BorderLayout.SOUTH);
    	demarrer.addActionListener(e -> fichierWAV.start());
    	arreter.addActionListener(e -> fichierWAV.stop());
     
    	this.setVisible(true);
     
    }
     
    public static void main(String[] args) {
    	// TODO Auto-generated method stub
     
    	File file = new File("musique.wav");
     
    	FichierWavImpl music = new FichierWavImpl(file);
    	Demarrer5 action = new Demarrer5(music);
     
    }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    package othello;
     
    public interface FichierWav {
     
    	void start();
     
    	void stop();
     
    }

  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5
    Par défaut
    Dans la programmation des Thread, il faut différentier 2 problèmes:
    1) La tâche
    2) La façon de lancer la tâche.

    La tâche peut être lancer dans un thread unique (cas ici), un pool de Thread, voir utiliser les Threads Virtuels depuis Java 21.

    Runnable est l'interface qui représente la tâche à exécuter.

    ExecutorService ( https://docs.oracle.com/en/java/java...orService.html ) est une interface qui se charge de lancer les tâches dans un Thread ou un pool de thread.

    C'est également un contrat. Avec le sacro-saint principe "Je sais ce que tu fais, mais je ne veux pas savoir comment tu es codé".

    C'est un contrat à destination de l'utilisateur qui sert à lancer des tâche (des Runnable).

    Ici, on n'a pas à savoir comment sont lancé les tâche (Thread unique, pool de thread, thread virtuel...).

    On sait juste que la tâche sera lancé dans un nouveau Thread.

    Et la ligne de code pour ça est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    executorService.execute(this)
    execute (qui prend en paramètre un Runnable, soit une tâche) permet d'éxécuter un tâche sur un nouveau Thread.

  12. #12
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5
    Par défaut
    Comme lire le fichier est la tâche et que la tache est un Runnable, le fichier est lu dans la méthode run.

    D'ailleurs, ici, l'IHM voir FichierWavImpl comme une interface FichierWav. Il ne voit pas que c'est un Runnable, et il n'a pas besoin de le voir. Il a juste besoin de savoir que il peut stop et start le fichier WAV.

    Par contre, l'ExecutorService voit FichierWavImpl comme un Runnable. Il ne sait pas que FichierWavImpl est un FichierWav. et il n'a pas besoin de le savoir.

    De fait, dans start, on lit dans un thread séparé le fichier. D'où la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    executorService.execute(this)

  13. #13
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5
    Par défaut
    Commentaire de:
    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 void run(){
     
     
     
    	  AudioInputStream audioInputStream = null;
    	  try{
    	  			//obtention d'un flux audio à partir d'un fichier (objet File)
    	       audioInputStream = AudioSystem.getAudioInputStream(fichierWAV);
    	       System.out.println("run lancé");
     
    	       int i =0;
    	       //WavPlayer wp = new WavPlayer(new File("vague.wav"));
    	       while(isReading){ 
    	     	   i++;
    	     	   //Je continue le traitement que si je lis
    	           //Ecrire le traitement
     
    	    	   System.out.println("compteur = "+i);
    	    	   Thread.sleep(1000);
    	        }
     
    	     } catch (UnsupportedAudioFileException e) {
    	         	e.printStackTrace();
    	           return;
    	     } catch (IOException e) {
    	             e.printStackTrace();
    	             return;
    	     } catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
      }
    Pour commencer,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      AudioInputStream audioInputStream = null;
    	  try{
                  audioInputStream = AudioSystem.getAudioInputStream(fichierWAV);
    Doit être remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	  try(AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fichierWAV)){
    AudioInputStream ( https://docs.oracle.com/en/java/java...putStream.html ) est un stream, et en particulier un Autoclosable.

    Il doit être fermé après chaque utilisation pour libérer les ressources. Il faut donc le fermer à la fin et la meilleur façon de le fermer est le try-with-ressources.

    Ensuite, je pense que le code fonctionne. C'est juste que le AudioInputStream n'est pas utilisé.

    Le code est équivalent à:
    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
     
    public void run(){
     
     
     
    	       System.out.println("run lancé");
     
    	       int i =0;
    	       while(isReading){ 
    	     	   i++;
    	     	   //Je continue le traitement que si je lis
    	           //Ecrire le traitement
     
    	    	   System.out.println("compteur = "+i);
    	    	   Thread.sleep(1000);
     
      }
    Aux exceptions près (comme pour IOException si le fichier n'existe pas, par exemple).

    Donc ça doit marcher, au moins dans la console de log d'Eclipse (ou autre IDE).

    Pour la suite, je ne sais pas comment marche AudioInputStream.

  14. #14
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Octobre 2023
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2023
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Probleme Résolu
    Voila cela fonctionne,
    il fallait effectivement utiliser audioInputStream dans le constructeur avec la classe Clip et gerer dans start() et stop()
    voici le code definitif.

    Merci de votre aide, de vos conseils et de votre patience.
    Cordialement.

    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
     
    package othello;
     
    import java.io.File;
    import java.io.IOException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
     
    import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.Clip;
    import javax.sound.sampled.DataLine;
    import javax.sound.sampled.LineUnavailableException;
    import javax.sound.sampled.SourceDataLine;
    import javax.sound.sampled.UnsupportedAudioFileException;
     
    public class FichierWavImpl implements FichierWav, Runnable{
     
      private File fichierWAV = null;
      private Clip  clip =AudioSystem.getClip();
      private AudioInputStream audioInputStream;
      private ExecutorService executorService;//Pour lancer le Thread
     
      private boolean isReading=false;  //Suis-je en train de lire
     
      public FichierWavImpl(File fichierWAV) throws IOException, UnsupportedAudioFileException, LineUnavailableException{
        this.fichierWAV = fichierWAV;
        this.audioInputStream = AudioSystem.getAudioInputStream(fichierWAV);;
        this.clip.open(this.audioInputStream);
     
      }
      //Rappel: On surcharge. On donne une implémentation, ici pour Runnable
     
     
     
      public void run(){
     
    	  int i =0;
    	  System.out.println("run lancé");
     
    	  while(isReading){ 
        	   i++;
        	  //java.awt.Toolkit.getDefaultToolkit().beep();
     
        	   //Je continue le traitement que si je lis
              //Ecrire le traitement
     
       	   System.out.println("compteur = "+i);
       	   try {
    		Thread.sleep(1000);
    	} catch (InterruptedException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
     
    	}
     
      }
     
      //Maintenant, pour l'extérieur
     
      public void start(){
     
    	System.out.println("Debut de start");
     
        if(!isReading){//Appeler cette méthode  n'a de sens que si on n'est pas en lecture
     
        isReading = true;//On passe en mode lecture
     
        this.clip.start();
     
         executorService = Executors.newSingleThreadExecutor();// On implémente la classe qui va permettre de lancer la tâche dans un Thread séparé.
         executorService.execute(this);//On exécute la tâche dans un Thread séparé. A noté que l'on a déporté encore la gestion du thread (et les difficulté inhérente ailleurs). C'est encore une application de SOLID.
     
        }
      }
     
     
      public void stop(){
    	  System.out.println("Debut de stop");
    	  this.clip.stop();
     
     
        if(isReading){//N'a de sens que si on lit
          isReading = false;//On change l'état, notament pour la méthode run, et arrêter la méthode run.
          executorService.shutdown();//On ferme l'exécutor.
        }
      }
    }

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Octobre 2023
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2023
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Mise en ligne du jeu
    Bonjour,
    voila mon programme Othello est terminé, ils fonction en LAN à la maison.
    J'aimerai pouvoir faire des parties en ligne avec mes enfants, cependant je ne vois pas comment faire puisque l'addresse IP public de chacun bouge et que les box filtrent les accès entrant et sortant.

    Aussi, je me demandais, y a t-il un moyen d'héberger une application JAVA et que tout le monde puisse jouer ?
    Merci d'avance si vous avez une idée ?
    Pour le moment en LAN chacun lance JeuBlancs ou jeuNoirsNom : Screenshot_2023_11_05-1.jpeg
Affichages : 34
Taille : 288,8 Ko

  17. #17
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 462
    Points : 896
    Points
    896
    Billets dans le blog
    5
    Par défaut
    Pas à ma connaissance (ici, on a un client lourd).

    De plus, les Applets ont été supprimées.

    Le mieux serait de développer une fonctionnalité Socket, mais c'est un peu pénible et chiant.
    C'est dans le Delannoy:
    https://www.eyrolles.com/Informatiqu...9782416000188/

    Où ici:
    https://www.jmdoudoux.fr/java/dej/chap-net.htm

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Octobre 2023
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2023
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Re mais j'utilise deja les sockets et le protocole UDP
    en fait JeuBlancs et Jeunoirs (.jar) envoient leur coup et mettent a jour en temps reel leur grille via des sockets UDP

  19. #19
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je veux dire, on peut faire tourner n'importe quel programme dans le cloud, et donc notamment héberger n'importe quelle appli qui servira de point de rendez-vous entre deux clients lourds (en général on se contente d'en faire un serveur par lequel les deux clients doivent passer.)

    La difficulté consiste surtout à apprendre à héberger des choses, et aussi c'est pas gratuit (même si les coûts ont pas mal diminué depuis l'époque du VPS classique).
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. lecture d'un fichier wav/analyse sonore
    Par gaspardgas dans le forum Général Python
    Réponses: 3
    Dernier message: 31/12/2016, 13h43
  2. [Débutant] lecture d'un fichier .wav
    Par Maha Ing dans le forum MATLAB
    Réponses: 4
    Dernier message: 16/05/2014, 17h05
  3. Lecture d'un fichier wav
    Par hadeel dans le forum C
    Réponses: 8
    Dernier message: 04/06/2008, 22h18
  4. Lecture d'un fichier .wav octet par octet
    Par DevVB dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 27/07/2007, 12h10
  5. [Java 1.4] : lecture d'un fichier octet par octet
    Par Thi0123 dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 08/06/2007, 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