Accueil > > > EXEMPLE D'UTILISATION DE CONTROL.INVOKE
EXEMPLE D'UTILISATION DE CONTROL.INVOKE
Information sur la source
Description
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.wi ndows.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
- 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);
- }
- // ****************
- }
- }
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
Historique
- 21 novembre 2005 18:13:02 :
- ajout des mots clés
- 11 mars 2006 15:51:19 :
- Suppression de quelques horribles concaténations de chaînes ^^
- 04 mai 2008 17:03:12 :
- Changement liens vers MSDN suite au shutdown complet de l'ancienne version (et des redirections).
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Cross-thread problème [ par winny68 ]
Bonjour, j'ai un problème de compréhension pour réaliser un cross-thread via l'invoke. j'ai vu qu'il y a deux manières de faire un appel; Acti
Thread et création de control [ par Bhaal_DtC ]
Tout d'abors je vais résumer ma situation le plus clairement possible. j'utilise un thread spécifique pour lire des données dans le cad
Thread, class et objets [ par thebigboss ]
Bonjour, J'ai un programme avec une mainform qui appelle une class. J'ai une progressbar dans ma mainform et un thread qui la fait avancer (à l'aide
Equivalent à Control.Invoke? [ par leprov ]
Existe-t-il un équivalent à la méthode control.invoke qui aie la meme fonctionnalité, mais lorsque l'on ne dispose pas d'un controle? c'est plus une c
Threading sur le .NET CF [ par t00f ]
Bonjour à tous, Je viens vers vous car j'ai une question qui peut paraitre stupide mais sincère : Je cherche a créer un Control personnalisé (type c
Empêcher multiples threads [ par ansizak ]
Bonjour, Je travaille sur un code qui génère des graphes. La génération du graph s'effectue dans un thread afin de permettre l'utilisation du reste d
Ajout d'un contrôle depuis un thread en utilisant Invoke... [ par gazous ]
Bonjour,Je vous contacte car j'ai vu que vous étiez assez calé en dll.Mon problème :J'ai un thread qui essaye d'ajouter un contrôle dans un panel char
Thread - Controls [ par bucherb ]
Hello!J'ai un petit problème.. Je souhaite créer un control dans un Thread séparé du Thread principal... Comment est-ce que je peu
Thread et control [ par RMI ]
Bonjour, Voila mon problème: J'ai une form avec un tabcontrol Les 2 premières tabpages sont rempli dans le load du winform la 3ème con
|
Derniers Blogs
MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril SHAREPOINT 15 TECHNICAL PREVIEW MANAGED OBJECT MODEL SOFTWARE DEVELOPMENT KITSHAREPOINT 15 TECHNICAL PREVIEW MANAGED OBJECT MODEL SOFTWARE DEVELOPMENT KIT par Matthew
http://www.microsoft.com/download/en/details.aspx?id=28768&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+MicrosoftDownloadCenter+(Microsoft+Download+Center) ...
Cliquez pour lire la suite de l'article par Matthew
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|