Slider et multithreading

Signaler
Messages postés
23
Date d'inscription
mardi 11 juillet 2006
Statut
Membre
Dernière intervention
27 octobre 2008
-
Messages postés
23
Date d'inscription
mardi 11 juillet 2006
Statut
Membre
Dernière intervention
27 octobre 2008
-
Bonsoir,

Je souhaite binder un control Slider avec la lecture d'un morceau MP3, en WPF.
Mais ça ne semble pas fonctionner pas de manière déclarative.

Alors je passe par du code et en particulier du multithreading.
Le thread principal contient le code qui lit le morceau.
La méthode _lire appelle la methode _derouler(Slider sl)
Cette méthode instancie un thread, qui lance la méthode _derouler de la classe HandlerThreadMorceau
Je suis apparemment obligé de passer par une classe comme HandlerThreadMorceau, pour passer en paramètre au nouveau thread la position courante du morceau. On ne peut en effet directement faire new Thread(new ThreadStart(methode(param))

_derouler(Slider sl)
{
    Thread myThread;
   HandlerThreadMorceau = new HandlerThreadMorceau(Slider sl, this, Lecteur.CurrentPosition);
   myThread =  new Thread(new ThreadStart(HandlerThreadMorceau._derouler);
 myThread.Start();

}

public class HandlerThreadMorceau
{
      private double maNouvellePosition;
     private Slider monSlider;
      private Audio monAu;

      public HandlerThreadMorceau(Slider sl, Audio au, double nouvellePosition)
      {
           monAu = au;
         monSlider = sl;
          maNouvellePosition =   nouvellePosition;         
      }

      public void _derouler()
      {
            monSlider.Value = maNouvellePositio
       }
}

Et c'est là que ça coince.  monSlider.Value = maNouvellePosition déclenche l'erreur suivante : "on ne peut attribuer une valeur à monSlider.Value car il appartient à un thread différent".

Comment faire donc pour réctifier ce code, afin que mon slider suive la progression du morceau de musique.

Herwin

2 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Messages postés
23
Date d'inscription
mardi 11 juillet 2006
Statut
Membre
Dernière intervention
27 octobre 2008

Merci pour ces précisions.
Mais je ne suis pas en Winforms mais en WPF. Et Control.Invoke n'existe pas.
Je passe donc par Control.Dispatcher.

Mais le threading n'étant pas ma tasse de thé, je n'arrive pas à finaliser mon code :  Le slider reste immobile, tandis que le morceau de musique est lu.

<hr />
private delegate void AppelMethodeDelegate();
       
        private void btnLecture_Click(object sender, RoutedEventArgs e)
        {
          
       CtrLecture._lire();
       AppelMethodeDelegate appel = new AppelMethodeDelegate(_derouler);
       sliderMorceau.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, appel);       
}

        private void _derouler()
        {
           sliderMorceau.Value = CtrLecture.Lecteur.CurrentPosition;       
}
<hr />

Herwin