Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

THREADER SIMPLEMENT UNE CLASSE POUR INTERAGIR AVEC UNE FORM


Information sur la source

Catégorie :.NET Source .NET ( DotNet ) Classé sous : thread, form, invoke, evenement Niveau : Débutant Date de création : 16/04/2007 Date de mise à jour : 16/04/2007 14:33:17 Vu / téléchargé: 6 578 / 386

Note :
Aucune note

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note


Description

Il s'agit d'une classe dont la procédure principale fonctionne sur un Thread différent si une Form a été indiquée dans le constructeur (ici, la procédure ne fait rien à par se reposer...lol). Le pricincipe de cette classe est d'avoir un évenement permettant de communiquer entre le Thread et la Form... je sais qu'il en doit exister pas mal sur le principe de L'Invoke des "Controles", mais j'ai perso cherché un moment avant de trouver un truc simple. Je trouve donc que cette manière de procéder est très simple, et encore plus lors de l'utilisation de la classe (voir le zip).
Ici, le délégué passe en paramètre des informations de progression, mais on peux imaginer passer n'importe quels autres données.
 

Source

  • using System;
  • using System.Text;
  • using System.Windows.Forms;
  • using System.Threading;
  • namespace ThreadWinForm
  • {
  • /// <summary>
  • /// Modèle pour les transmitions de messages entre un Thread et une Form
  • /// </summary>
  • /// <param name="Value">Pourcentage d'avancement du Thread</param>
  • /// <param name="Message">Message correspondant à l'avancement</param>
  • public delegate void OnProgressHandler(int Value, string Message);
  • /// <summary>
  • /// Classe dont l'action principale fonctionne sur un Thread
  • /// </summary>
  • public class ThreadProgress
  • {
  • /// <summary>
  • /// Constructeur sans Form
  • /// </summary>
  • public ThreadProgress() { }
  • /// <summary>
  • /// Constructeur avec Form
  • /// </summary>
  • /// <param name="FormStartThread">Form sur laquelle interagir</param>
  • public ThreadProgress(Form FormStartThread)
  • {
  • _formStartThread = FormStartThread;
  • }
  • private Thread myThread;
  • /// <summary>
  • /// Evenement de progression du Thread
  • /// </summary>
  • public event OnProgressHandler OnProgress;
  • private Form _formStartThread;
  • /// <summary>
  • /// Form sur laquelle interagir
  • /// </summary>
  • public Form FormStartThread
  • {
  • get { return _formStartThread; }
  • set { _formStartThread = value; }
  • }
  • /// <summary>
  • /// Procédure de lancement du Thread
  • /// </summary>
  • public void Start()
  • {
  • if (OnProgress != null && _formStartThread != null)
  • myThread = new Thread(new ThreadStart(ActionThreadMessForm));
  • else
  • myThread = new Thread(new ThreadStart(ActionThreadNoMess));
  • myThread.Start();
  • }
  • /// <summary>
  • /// Lancement du Thread avec traitement du délégué
  • /// </summary>
  • private void ActionThreadMessForm()
  • {
  • for (int i = 1; i <= 100; i++)
  • {
  • Thread.Sleep(100);
  • try
  • {
  • _formStartThread.Invoke(OnProgress, i, string.Format("Vous êtes à {0}%", i));
  • }
  • catch
  • {
  • myThread.Abort();
  • }
  • }
  • }
  • /// <summary>
  • /// Lancement du Thread seul
  • /// </summary>
  • private void ActionThreadNoMess()
  • {
  • for (int i = 1; i <= 100; i++)
  • {
  • Thread.Sleep(100);
  • }
  • }
  • }
  • }
using System;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace ThreadWinForm
{
    /// <summary>
    /// Modèle pour les transmitions de messages entre un Thread et une Form
    /// </summary>
    /// <param name="Value">Pourcentage d'avancement du Thread</param>
    /// <param name="Message">Message correspondant à l'avancement</param>
    public delegate void OnProgressHandler(int Value, string Message);
    /// <summary>
    /// Classe dont l'action principale fonctionne sur un Thread
    /// </summary>
    public class ThreadProgress
    {
        /// <summary>
        /// Constructeur sans Form
        /// </summary>
        public ThreadProgress() { }
        /// <summary>
        /// Constructeur avec Form
        /// </summary>
        /// <param name="FormStartThread">Form sur laquelle interagir</param>
        public ThreadProgress(Form FormStartThread)
        {
            _formStartThread = FormStartThread;
        }

        private Thread myThread;
        /// <summary>
        /// Evenement de progression du Thread
        /// </summary>
        public event OnProgressHandler OnProgress;
        private Form _formStartThread;
        /// <summary>
        /// Form sur laquelle interagir
        /// </summary>
        public Form FormStartThread
        {
            get { return _formStartThread; }
            set { _formStartThread = value; }
        }

        /// <summary>
        /// Procédure de lancement du Thread
        /// </summary>
        public void Start()
        {
            if (OnProgress != null && _formStartThread != null)
                myThread = new Thread(new ThreadStart(ActionThreadMessForm));
            else
                myThread = new Thread(new ThreadStart(ActionThreadNoMess));
            myThread.Start();
        }

        /// <summary>
        /// Lancement du Thread avec traitement du délégué
        /// </summary>
        private void ActionThreadMessForm()
        {
            for (int i = 1; i <= 100; i++)
            {
                Thread.Sleep(100);
                try
                {
                    _formStartThread.Invoke(OnProgress, i, string.Format("Vous êtes à {0}%", i));
                }
                catch
                {
                    myThread.Abort();
                }
            }
        }

        /// <summary>
        /// Lancement du Thread seul
        /// </summary>
        private void ActionThreadNoMess()
        {
            for (int i = 1; i <= 100; i++)
            {
                Thread.Sleep(100);
            }
        }
    }
}

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

16 avril 2007 14:33:18 :
ajout de commentaires et correction de fautes

Commentaires et avis

signaler à un administrateur
Commentaire de TheManu le 06/12/2007 17:16:33

Tu peux encore 'simplifier' ta classe ThreadProgress ,en tout cas la rendre plus générale. Elle doit être 'intermédiaire' entre le traitement -ici téléchargement par exemple- et l'écouteur -ici la form et l'affichage de progression. Donc tu peux :
- 1 : Brancher des méthodes ('en écoute') à ton 'OnProgressHandler' (qu'on pourrait appeler evenOnProgress) qui se chargeront de l'affichage (et autres). 2 : Le traitement peut être extérieur à ta classe (avec bien sûr une 'réf' sur la méthode d'appel 'On...()', public et lançant l'évènement).
D'où 'séparation' de l'affichage avec le traitement (ActionThreadMessForm).
- Le 'invoke' peut alors être placé dans ta méthode 'évènement' cad OnProgress.
-cad : Classe traitement --appel--> classe intermédiaire, évènement 'On...' --propage (avant de rendre la main) l'appel--> sur le thread de la form avec la ou les méthode(s) (ou rien.. si _formStartThread à null) en écoute.
- Modif :
        public event OnProgressHandler evenOnProgress;//au lieu de OnProgress. public pour ajout 'écouteur(s)'
        public void OnProgress(int i){
           if (_formStartThread != null && _formStartThread.InvokeRequired)
              _formStartThread.Invoke(evenOnProgress, new object[] {i});
           else
              evenOnProgress(i);}

///////Et dans la classe de traitement :
        private ThreadProgress refThreadProgress;
        public void Start(){
           //traitement....
           refThreadProgress.Progress(i);
           //suite du traitement...

signaler à un administrateur
Commentaire de TheManu le 06/12/2007 17:18:23

Pardon, l'avant dernière ligne doit être : refThreadProgress.OnProgress(i);

signaler à un administrateur
Commentaire de Yxion le 06/12/2007 17:21:34

C'était juste un exemple d'implémentation et d'utilisation de Control.Invoke()

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

evenement keypress [ par Thanos_the_yopper ] j'ai un window.form et je voudrais que quand j'appuis sur Echap, ca le ferme .... j'ai rajouter un evenement keypress sur le form, mais ca fait rien d Recherche d'un evenement sur un Form [ par oxboz ] Salut !! Voila j'ai une question surement bidon. J'ai la fenetre principal de mon projet. Quand je le lance je souhaite que cette fen&#234;tre s'aff Problème de thread, socket et form [ par Florynth ] Bon pas très compliqué,j'ai créé un thread qui écoute un portaprès je pèse sur un bouton qui fait connectédonc il créé un socket le connect au port en Problème de thread (encore) [ par Bidou ] En fait, je dois charger des donn&#233;es dans un Listview, et ca peut prendre du temps.Donc pendant le temps de chargement et d'affichage, j'affiche evenement "Form_Unload" [ par fred65200 ] Bonjour &#224; tous, je cherche la synthaxe pour d&#233;clencher un evenement &#224; la fermeture d'un Form. Pour l'instant je n'ai rien trouv&#233;. Thread et menu contextuel [ par seblx ] Bonjour &#224; tous,J'ai une form qui enregistre un menu contextuel (Shell) et qui lance un thread suppl&#233;mentaire. Mon menu rajoute une action "S actualisation de la form a partir d'un thread. [ par bwoufy82 ] Bonjour a tous.Voiladepuis 3 jours je n arrive pas a trouver comment faire pour que mon thread accede a ma form.J'esxplique se que je cherche a faire Problème de Form [ par emmanuel9 ] Bonjour &#224; tous, En faite je voudrais faire apparaitre une Form par dessus une autre pendant 3 seconde. Donc dans l'&#233;venvement Load je fais ouvrir une form enfant dans un thread différent [ par bossun ] salut,Dans une appli MDI, ne veux ouvrir mes feilles enfants dans un thread différent à chaque fois. donc je voudrais utiliser le backgroudnworker pou Ouvrir plusieurs instances d'un même thread [ par immerczeck ] Bonjour!mon problème est le suivant : à partir d'un thread, je voudrais créer "à l'infini" des instances d'une nouvelle fenêtre, chacune avec un titre


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,44 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.