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

Concurrence et multi-thread Java Discussion :

Synchronisation d'un thread


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 20
    Par défaut Synchronisation d'un thread
    Bonjour,

    J'ai un problème de synchronisation d'un thread que je n'arrive pas à résoudre pour mon logiciel Jalmus.

    J'ai tout d'abord une séquence MIDI avec la partition correspondante qui s'affiche à l'écran. L'utilisateur utilise le clavier pour donner le rythme : pour cela un curseur parcourt la partition à la même vitesse que la musique et si l'utilisateur tape et que le curseur est au même niveau que le rythme c'est qu'il a bien répondu.

    Voici ce que cela donne pratiquement :



    J'utilise un thread pour le déplacement du curseur avec le booléen cursorstart pour le départ et dans le run :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      if (selectedGame == 2  && cursorstart) {
     
         cursorspeed = (float) tempo/ (float) 55.520;
         if (rhythmCursor < 714) 
                  rhythmCursor = rhythmCursor + cursorspeed;
         else {
              if (rhythmAnswerDportee < dportee +200) {
                     rhythmAnswerDportee = rhythmAnswerDportee + 100;
                      rhythmCursor = (float) (72.0 + cursorspeed);
                  }
     
     }
    Et pour lancer le curseur j'ai ajouté un marqueur sur le quatrième temps de ma séquence MIDI que je contrôle par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     sm_sequencer.addMetaEventListener(new MetaEventListener() {
                public void meta(MetaMessage meta) {
     
                    byte[] abData=meta.getData();
                    String strText=new String(abData);
     
                    if ("departthread".equals(strText)) {
                        cursorstart = true;     
                    }
    Comme vous pouvez le voir sur l'image il y a un retard sur le démarrage du curseur (si l'on tient compte du décalage du premier temps cela semble bien fonctionner). Le curseur ne démarre pas immédiatement après avoir passé cursorstart à true.

    Je ne maitrise pas très bien les thread. Y-a-t-il une solution pour le curseur démarre exactement sur le quatrième temps de ma séquence ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    Bonjour,

    Le problème vient-il de l'affichage qui est décalé par rapports aux noires, ou se produit-il réellement en retard?

    Dans le premier cas, en appliquant une correction à l'initialisation de rhythmCursor les points rouges pourraient se retrouver pile au-dessus des notes.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 20
    Par défaut
    Dans l'exemple j'ai tapé exactement sur les temps, donc oui, si je décale la position de départ du curseur (en fonction du tempo) cela fonctionne (les points tombent bien sur les noires).

    Le problème est que j'ai peur que ce décalage varie suivant l'ordinateur utilisé (OS, processeurs ...). Si mon problème provient bien du retard de démarrage du thread, le décalage du curseur pourrait fonctionner sur mon poste mais pas pour tout le monde.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    a mon avis ce n'est pas comme ça que tu dois gérer.

    Tu ne dois pas seulement basculer le flag qui fait démarrer ton thread (tu ne peux pas prévoir quand il verra vraiment ce flag basculé). Tu dois en plus l'informer du moment précis où tu as abaissé ce flag. Il suffit de lui transférer la valeur de System.currentTimeMillis(). Ensuite, le thread qui fait avancer le curseur, 20 ou 50 fois par secondes prendra le currentTimeMillis)(), fera la différence avec le moment de départ et en calculera alors la position courante dans la portée.

    De même, lorsque tu appuiera sur une touche, il faudra soit traiter immédiatement, soit noter le moment où ca s'est produit pour, suivant le même calcul, connaitre l'endroit exact.



    Aussi, basculer un flag booléen, il me semble, n'est pas le meilleurs moyen de faire démarrer un thread. Il vaut mieux utiliser un système de wait/notify qui permet au thread en question de ne pas "tourner à vide" en attendant

  5. #5
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 20
    Par défaut
    Merci beaucoup tchize cela améliore effectivement la précision mais il y avait un autre problème beaucoup plus important que je n'avais pas prévu.

    Il doit y avoir un décalage entre le moment où l'évènement MIDI est déclenché ("departthread" dans mon cas) et le moment ou le son est émis. Cette latence est pour moi d'à peu près 200 ms et cela expliquerai le décalage.

    Par contre cela doit varier en fonction du PC et je vais être obligé de demander à l'utilisateur de régler cette variable lui-même.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je connais des masses le séquencer, mais faire un synchro sur base de setmicrosecond serait peut etre plus précis que de jouer sur un event (qui va être faussé par le buffer du playback)

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

Discussions similaires

  1. Synchronisation de n threads
    Par elm dans le forum C
    Réponses: 2
    Dernier message: 31/07/2007, 15h30
  2. [Thread] [synchronised] utilisation sans thread
    Par philippe13 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 01/03/2007, 09h25
  3. synchronisation entre deux threads
    Par chabfive dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 03/11/2006, 12h17
  4. synchronisation de 2 threads
    Par chonos dans le forum C++
    Réponses: 8
    Dernier message: 28/08/2006, 17h03
  5. Synchronisation entre 2 threads
    Par bodbod dans le forum C++
    Réponses: 8
    Dernier message: 20/08/2004, 18h29

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