none
Comment accéder a un contrôle depuis un autre thread RRS feed

  • Question

  •  

    Le formulaire de l’application est normalement manipulé par le thread principal. Si on décide de créer un nouveau thread, on le fait d’habitude pour gérer des calculs dans l’arrière-plan, sans affecter l’interface utilisateur. Par exemple, des opérations qui consomment beaucoup de temps risquent de rendre l’interface inutilisable pour l’utilisateur. Pour éviter ces situations, on utilise un thread séparé, qui fait les taches difficiles et laisse libre le thread principal. Mais qu’est-ce qu’on fait si le thread secondaire a besoin de gagner contrôle aux éléments de l’interface, qui sont gérés par le thread principale ? On rencontre dans ce cas un problème d’accès conçurent, qui complique les choses. Même s’il n’est pas recommandé, si vous avez besoin d’utiliser un thread secondaire pour modifier les éléments, d’interface, voilà comment le faire :

     

    Créez une application Windows Forms et ajoutez un bouton sur le formulaire. Quand l’utilisateur appuie sur ce bouton, un nouveau thread est créé. Ce thread va modifier la position du bouton sur l’écran.

     

    //Déclarez un nouveau délégué de type void et sans paramètres : 
    public delegate void ResultDelegate(); 
     
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
     
     
    //le click sur le bouton démarre un nouveau thread
        private void button1_Click(object sender, EventArgs e)
        {
          Thread d = new Thread(new ThreadStart(TheThread));
          d.Start(); 
        }
     
     
    //la méthode exécutée par le nouveau thread
        private void TheThread()
        {
          for (int i = 0; i < 100; i++)
          {
            MoveControl();        
          }
        }
     
     
    //on appelle cette méthode à partir du thread secondaire, pour modifier
    // la position du contrôle géré par le thread principal
        private void MoveControl()
        {
          if (this.button1.InvokeRequired)
          {
    //si on ne peut pas modifier le bouton a ce moment,
    // on appelle à nouveau la même méthode
            ResultDelegate d = new ResultDelegate(MoveControl);
            this.Invoke(d, new object[] { });
          }
          else
          {
    //on a accès au bouton, donc on modifie sa position
            this.button1.Top--; 
          }
     
        }
      }
     
    

     

     

     

     

     

    Pour plusieurs questions sur Visual Basic .NET, visitez Foire aux Questions – Didacticiels et ressources .NET Framework 


    Suivez MSDN sur Twitter 

    jeudi 17 février 2011 15:59

Toutes les réponses

  • Bonsoir Alex et merci pour ce petit tuto très intéressant, j'avais pas pensé aux délégués :)

    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    jeudi 17 février 2011 17:34
  • Haa ! c'est plus ce que c’était avant :)

    Sinon pour les calculs plus lourds on pourrais utiliser le sémaphore , je crois que c'est un niveau au dessus que le thread et les délégué, il n'a pas de notion First in First out les résultat peuvent être aléatoire mais bon rien a voir avec la gestion des contrôle.

    il y aurais peut être besoin d'une version VB ?


    Cordialement,
    Xavier
    Alias Troxsa My M@iL
    jeudi 17 février 2011 17:48