Slider et multithreading

herve_labenere Messages postés 23 Date d'inscription mardi 11 juillet 2006 Statut Membre Dernière intervention 27 octobre 2008 - 17 oct. 2008 à 17:16
herve_labenere Messages postés 23 Date d'inscription mardi 11 juillet 2006 Statut Membre Dernière intervention 27 octobre 2008 - 27 oct. 2008 à 15:25
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

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
19 oct. 2008 à 16:40
0
herve_labenere Messages postés 23 Date d'inscription mardi 11 juillet 2006 Statut Membre Dernière intervention 27 octobre 2008
27 oct. 2008 à 15:25
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
0
Rejoignez-nous