Affichage de valeur provenant d'u thread dans un formulaire

Description

Développer sous VS2010
Framework 4.0

Le but cette source est de montrer comment gérer les événements, les fonction délégué, le tout avec un Thread.

Dans une Class on crée un compte à rebours qui décomptera dans un Thread pour pouvoir faire autre chose...C'est le but même des Threads, faire travailler en fond de taches des process.
Avec le compte à rebours, on remonte l'information d'événement du compteur (fini ou pas en bool, et la valeur du compteur en int)

Le formulaire principal (Form1) récupérer les événement puis affiche les informations dans des labels.

Source / Exemple :


using System;
using System.Threading;
using System.Windows.Forms;

namespace AppliThread
{
    public partial class Form1 : Form
    {
        private class TestThread
        {
            private Thread t;   // t variable représentant le thread
            private int cmpt;   // temps en seconde à attendre avant l'événement OK = TRUE
            public delegate void ETAT(bool et); // Fonction délégué pour la remonter de l'info OK, et la valeur du compteur
            public event ETAT OK;               // événement sur OK
            public delegate void ReturnCompteur(int num);   // Fonction délégué pour la remonter de la valeur du compteur
            public event ReturnCompteur InfoNum;            // événement sur la remonter su compteur
            private bool ThreadOK = true;

            public int ValNum       // Propriété en écriture seulement pour l'acquisition ou le changement du compteur
            {
                set { cmpt = value; }
            }

            public TestThread() // Constructeur de class (sans paramètre)
            {
                cmpt = 5;
            }

            public TestThread(int ValeurNum) // constructeur de class (surcharge) (avec passage de l'initialisation du compteur)
            {
                cmpt = ValeurNum;
            }

            public void RUN() // lancement du Thread
            {
                t = new Thread(Decompte);   // Création du thread sur la fonction Decompte
                t.Name = "Nyuki";
                ThreadOK = true;
                t.Start(); // lancement du thread
            }

            private void Decompte() // Un programme de décompte
            {
                int a = cmpt;
                while (a > 0 && ThreadOK)
                {
                    OK(false);
                    InfoNum(a);
                    Thread.Sleep(1000);
                    a--;
                }
                OK(true);
                InfoNum(a);
                t = null;
            }

            public void Kill()
            {
                ThreadOK = false; // permet de forcer la sortie du thread
            }
        }

        private delegate void AffichageLabel(Label l, string text); // ?...permetra l'écriture dans les Label 1 et 2  par le Thread
        private TestThread Test;

        public Form1() // constructeur du formulaire
        {
            InitializeComponent();
            //Test = new TestThread(); // initialisation sans paramètre
            Test = new TestThread(10); // initialisation avec un paramètre
            Test.OK += new TestThread.ETAT(Test_OK);
            Test.InfoNum += new TestThread.ReturnCompteur(Test_InfoNum);
            this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Test.Kill(); // permet de quitter proprement le thread sans Thread.Abort(); >> dans notre cas dans la Class TestThread t.Abort();
        }

        private void Test_InfoNum(int num)
        {
            // label1.Text = num.ToString(); // Enlever les commentaire compiler et erreur....normal le thread ne peut pas directement agir sur les composant du formulaire
            AffLbl(label1, num.ToString());
        }

        private void Test_OK(bool et)
        {
            AffLbl(label2, et.ToString());
        }

        private void AffLbl(Label l, string m)
        {
            if (l.InvokeRequired) // on vérifier si l'on peut accéder au label (soit Label1, soit Label2)
            {
                AffichageLabel d;
                d = new AffichageLabel(AffLbl); // Lien ente la fonction délégué et la fonction a exécuter

                this.Invoke(d, new object[] { l, m }); // le Formulaire passe les paramètres à la place du Thread
            }
            else
            {
                l.Text = m;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Test.RUN();
        }
    }
}

Conclusion :


Source déjà présente sur CodeSource (en plusieurs code) mais ayant eu du mal à comprendre au premier abord, je ne suis dit comme j'ai réussi à comprendre, je dois faire passer l'info à ma façon pour si d'autre personne sont dans le même cas que moi...Parfois de voir les choses sous un autre angle permet de mieux comprendre, ou de mieux appréhender. Tel est le but de CodeSource : l'entre aide entre développeur !

Donc voilà pourquoi j'ai posté cette source, simple quand on connait, et qu'on maitrise le sujet...

@+,
Nyuki, le codeur fou...

Codes Sources

A voir également

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.