begin process at 2012 02 11 11:09:18
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

.NET

 > THREADER SIMPLEMENT UNE CLASSE POUR INTERAGIR AVEC UNE FORM

THREADER SIMPLEMENT UNE CLASSE POUR INTERAGIR AVEC UNE FORM


 Information sur la source

Note :
Aucune note
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é :10 067 / 536

Auteur : Yxion

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
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

Les Membres Club peuvent 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

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) GRAPHIQUE TYPE SECTEUR
Source .NET (Dotnet) REFLECTION .NET
Source avec Zip Source .NET (Dotnet) WEBBROWSER GÉRANT POPUP, ONGLETS, BOUTONS SOURIS...
Source avec Zip Source .NET (Dotnet) DOWNLOADMANAGER ASYNCHRONE RÉUTILISABLE
Source avec Zip Source avec une capture Source .NET (Dotnet) CONTROLE D'ONGLET PERSONNALISABLE

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) ORIONBANQUE par toutphp
Source avec Zip Source avec une capture Source .NET (Dotnet) ORIONAPPLICATION par toutphp
Source avec Zip SOCKET CONNEXION CLIENT & SERVEUR par ziedto83
Source avec Zip Source .NET (Dotnet) FFMPEG.NET : WRAPPER .NET DE FFMPEG par MasterShadows
Source avec Zip Source .NET (Dotnet) ATTACHER, CRÉER ET SAUVEGARDER UNE BASE DE DONNÉES SQL SERVE... par Alvepinai

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) AFFICHAGE DE VALEUR PROVENANT D'U THREAD DANS UN FORMULAIRE par Nyuki
Source avec Zip Source .NET (Dotnet) GESTION D'ÉVENEMENTS INTER FORM par ecosmose
Source avec Zip Source avec une capture Source .NET (Dotnet) THREAD ET PROGRESSBAR - EXEMPLE SIMPLE par MorpionMx
Source avec Zip Source .NET (Dotnet) MODIFICATION DE LA VALEUR D'UN CONTROLE À L'INTERIEUR D'UN T... par bestouinouin
Source .NET (Dotnet) BARRE DE STATUT ET DE PROGRESSION COMPATIBLE MULTITHREAD par cendretp

Commentaires et avis

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...

Commentaire de TheManu le 06/12/2007 17:18:23

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

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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,850 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales