Soyez le premier à donner votre avis sur cette source.
Vue 7 112 fois - Téléchargée 784 fois
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(); } } }
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.