IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Lancer plusieurs Thread exactement en même temps


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 36
    Points : 34
    Points
    34
    Par défaut Lancer plusieurs Thread exactement en même temps
    Bonjour,
    ne connaissant pas grand chose avec les thread, je vous pose la question suivante:

    Mon appli doit lire plusieurs son en même temps (les superposer donc)

    J'ai une classe runnable qui me lit un fichier son (.ogg dans mon cas).
    J'instancie cette classe autant de fois que j'ai de son à lire, puis j'utilise une boucle for pour lancer mes thread.
    Tout marche bien, sauf que j'ai 1/4 de seconde de décalage entre chaque sons.

    Existe t'il un moyen, en java, de lancer les threads exactement en même temps?

    Merci d'avance pour l'aide que vous pourrez m'apporter.

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    On ne peut garantir que les thread seront executés exactement en même temps. Le principe est qu'il sont exécutés a tour de role, l'un après l'autre. Le temps d'exécution étant court, on a l'illusion que l'exécution est simultanée mais ça n'est pas le cas.

    Il doit cependant être possible de s'assurer que cela se face dans des délais assez bref pour que ça ne soit pas perceptible. Essaie d'utiliser Thread.yield() juste après avoir lancé la lecture du son, cela permet de passer immédiatement le relai aux autres threads disponibles.
    Cependant le délai est aussi peutêtre du au temps de chargement du son. Je ne sais pas quelle système tu utilise, mais si c'est possible essaie de charger tous les sons avant de démarrer la lecture.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 36
    Points : 34
    Points
    34
    Par défaut
    oui, c'est vrai, je me suis mal exprimé.
    Quand je parle d'exécuter en même temps les threads, je voulais dire dans un laps de temps le plus petit possible, de manière à ce que cela ne soit pas perceptible.
    Quand je vois des application du genre audacity qui arrive à lancer plusieurs pistes audio simultanément, je me dis que c'est possible aussi en java.

    Merci pour ta réponse, je vais creuser la piste du Thread.yield().

    Sinon, j'ai pensé mixer les pistes en 1 seule piste avant de commencer la lecture, comme ça, je n'ai au final qu'une seule piste à lancer. Mais ça peut être handicapant si je veux rendre mué une piste durant la lecture.
    A voir.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Points : 170
    Points
    170
    Par défaut
    je pense que ton problème vient du temps de chargement du fichier.

    En fait tu pourrais utiliser une instance de la classe java.util.concurrent.CountDownLatch pour synchroniser le depart de tous tes threads.

    Un petit exemple de code simpliste:
    Pour lancer les threads ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         CountDownLatch doneSignal = new CountDownLatch(N);
     
         for (int i = 0; i < N; ++i) // create and start threads
           new Thread(new Worker( doneSignal)).start();

    Dans chaque threads:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     try {
            //Ben ici on lit le fichier ...
            doInit();
            doneSignal.countDown();
            doneSignal.await();
            //On lance la musique...
            go();
      } catch (InterruptedException ex) {} // return;

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 36
    Points : 34
    Points
    34
    Par défaut
    merci pour l'exemple, je connaissais pas.

    Sinon, ben j'ai trouvé d'où venait mon problème; une partie en tout cas.
    (J'avais oublié de préciser que mes fichiers étaient bien chargés en mémoire avant de lancer tout les threads, comme me l'avait préconisé Uther)

    J'ai converti les fichiers .ogg (en variable bitrate) en .mp3 (en constant bitrate), et là, je n'ai plus du tout de décalage. En tout cas rien de perceptible à l'oreille humaine.

    J'en conclue que le problème vient de ma lecture elle même, et non pas du temps d'exécution des threads.
    Il me reste donc encore un problème, mais qui n'a plus rien à voir avec le sujet initial, donc je vais faire un tour sur la partie du forum adéquat.

    Merci beaucoup pour vos réponses.

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

Discussions similaires

  1. Lancer plusieurs fonctions JavaScript sur même evenement
    Par davinout dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 23/07/2010, 17h37
  2. lancer plusieurs java application en même temps
    Par yacin87 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 03/04/2010, 00h24
  3. Plusieurs requêtes INSERT en même temps
    Par jeyce dans le forum JDBC
    Réponses: 3
    Dernier message: 06/11/2006, 09h42
  4. [VBS] Lancer plusieurs script dans le même interpréteur
    Par intrud3r dans le forum VBScript
    Réponses: 4
    Dernier message: 12/07/2006, 15h26
  5. Réponses: 7
    Dernier message: 05/06/2006, 13h44

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