Exemple d'utilisation de control.invoke

Soyez le premier à donner votre avis sur cette source.

Snippet vu 42 186 fois - Téléchargée 32 fois

Contenu du snippet

Suite à question(s) sur le forum :

Juste un petit exemple d'utilisation de la méthode Control.Invoke (http://msdn.microsoft.com/fr-fr/library/system.windows.forms.control.invoke.aspx) pour manipuler un contrôle depuis un autre thread que celui qui l'a crée.

Je vous met l'intégralité du code du Form, juste un petit c/c et c'est bon :-)

Source / Exemple :


using System; 
using System.Drawing; 
using System.Collections; 
using System.ComponentModel; 
using System.Windows.Forms; 
using System.Data; 
using System.Threading; 
  
namespace ControlInvokeSample 
{ 
    public class Form1 : System.Windows.Forms.Form 
    { 
        private System.Windows.Forms.Label label_Affichage; 
        private System.Windows.Forms.Button button_Start; 
        private System.ComponentModel.Container components = null; 
  
        public Form1() 
        { 
            InitializeComponent(); 
        } 
  
        protected override void Dispose( bool disposing ) 
        { 
            if( disposing ) 
            { 
                if (components != null) 
                { 
                    components.Dispose(); 
                } 
            } 
            base.Dispose( disposing ); 
        } 
  
        #region Code généré par le Concepteur Windows Form 
        /// <summary> 
        /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas 
        /// le contenu de cette méthode avec l'éditeur de code. 
        /// </summary> 
        private void InitializeComponent() 
        { 
            this.label_Affichage = new System.Windows.Forms.Label(); 
            this.button_Start = new System.Windows.Forms.Button(); 
            this.SuspendLayout(); 
            // 
            // label_Affichage 
            // 
            this.label_Affichage.Location = new System.Drawing.Point(8, 40); 
            this.label_Affichage.Name = "label_Affichage"; 
            this.label_Affichage.Size = new System.Drawing.Size(472, 72); 
            this.label_Affichage.TabIndex = 0; 
            // 
            // button_Start 
            // 
            this.button_Start.Location = new System.Drawing.Point(8, 8); 
            this.button_Start.Name = "button_Start"; 
            this.button_Start.TabIndex = 1; 
            this.button_Start.Text = "Start"; 
            this.button_Start.Click += new System.EventHandler(this.button_Start_Click); 
            // 
            // Form1 
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); 
            this.ClientSize = new System.Drawing.Size(488, 117); 
            this.Controls.Add(this.button_Start); 
            this.Controls.Add(this.label_Affichage); 
            this.Name = "Form1"; 
            this.Text = "Form1"; 
            this.ResumeLayout(false); 
  
        } 
        #endregion 
  
        [STAThread] 
        static void Main() 
        { 
            Application.Run(new Form1()); 
        } 
  
        // **************** 
        // définition du delegate qui sera utilisé 
        private delegate void UpdateLabelDelegate ( string text ); 
        // **************** 
  
        private UpdateLabelDelegate m_upLbl; 
        private Thread m_monThread; 
         
  
        private void button_Start_Click(object sender, System.EventArgs e) 
        { 
            button_Start.Enabled = false; 
             
            // affectation du nom du thread courant 
            Thread.CurrentThread.Name = "Thread principal"; 
  
            // initialisation de l'instance de UpdateLabelDelegate qui sera utilisée dans le thread 
            m_upLbl = new UpdateLabelDelegate(this.MaMethodeDeMajDuLabel); 
             
            // création et lancement du thread "supplémentaire" 
            m_monThread = new Thread(new ThreadStart(this.ThreadProc)); 
            m_monThread.Name = "Thread supplémentaire"; 
            m_monThread.Start(); 
        } 
  
        private void ThreadProc() 
        { 
            // le tableau d'object qui sera utilisé pour le passage des paramètres. 
            object [] args = new object[1]; 
  
            for ( int i=0; i<=10; i++) 
            { 
                // affectation du texte, c'est lui qui sera reçu en paramètre "text" de notre méthode 
                args[0] = string.Format("{0} (depuis : {1})", i.ToString(), Thread.CurrentThread.Name); 
                 
                // **************** 
                label_Affichage.Invoke(m_upLbl, args); 
                // **************** 
                 
                // petite pause 
                Thread.Sleep(500); 
            } 
  
            args[0] = string.Format("C'est fini :-) (depuis : {0})", Thread.CurrentThread.Name); 
            label_Affichage.Invoke(m_upLbl, args); 
        } 
  
        // **************** 
        // la méthode correspondant à la déclaration de UpdateLabelDelegate 
        // qui fera la MAJ du texte du Label dans le thread auquel appartient le contrôle. 
        private void MaMethodeDeMajDuLabel(string text) 
        { 
            // MAJ du texte en ajoutant le nom du thread depuis lequel cette maj est faite. 
            label_Affichage.Text = string.Format("{0}\r\nLabel mis à jour depuis : {1}", text, Thread.CurrentThread.Name);
        } 
        // **************** 
    } 
}

Conclusion :


Voir aussi le tuto de Mx : http://www.csharpfr.com/tutorial.aspx?ID=174

A voir également

Ajouter un commentaire

Commentaires

cs_coq
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
76
De rien.
Normalement il y a une zone "Donner une note à ce code source" dans le bloc "Ajouter un commentaire".
jeanflavien
Messages postés
4
Date d'inscription
vendredi 24 août 2007
Statut
Membre
Dernière intervention
25 juin 2011

Ok meri c'est sa. Comment je fais a mettre une note?
cs_coq
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
76
Ca ne me renseigne pas plus, mais je vais supposer qu'on parle d'un conflit avec la classe partielle définie dans Form1.designer.cs quand on crée un projet sous VS2005 et supérieurs :

Ce bout de code a été fait à l'époque .NET 1.1, c'est-à-dire avant l'apparition des classes partielles.
Il faut donc remplacer complètement les fichiers du "Form1" (.cs et .designer.cs) créé dans un projet .NET 2.0+ par celui-là.
Et il faut aussi supprimer la méthode Main, vu qu'elle existe déjà dans Program.cs
jeanflavien
Messages postés
4
Date d'inscription
vendredi 24 août 2007
Statut
Membre
Dernière intervention
25 juin 2011

1. Déjà y'a une demi etoile dans le commentaire alors que j'ai cliqué sur rien,
2. Quand je colle le code sa me mets 40 000 erreus avec Initialize component et tout sa.
cs_coq
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
76
Du genre ?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.