Partage
  • Partager sur Facebook
  • Partager sur Twitter

delegate event

Sujet résolu
    23 mars 2012 à 10:24:48

    Bonjour :)

    J'essaye de bien comprendre comment fonctionnent les delegate et event (ce dont j'ai toujours pu me passer)

    J'ai fait un petit programme à la c** avec 2 boucles dans 2 threads.
    L'un affiche des "." toutes les secondes
    L'autre, affiche un message à la pression de la touche 'y'

    Jusque là, tout va bien.

    Maintenant, je voudrais créer un évenement dans la class principale à la pression de la touche 'y' (une version sans et une avec passage de paramètre) puis, si c'est possible, provoquer un évenement dans l'autre thread (avec la version sans et avec paramètres).

    je suis coincé là :
    using System;
    using System.Threading;
    
    
    public class monThread1
    {
    	
    	public delegate void DelegateEvenement (string message);
    
    	public event DelegateEvenement Evenement;
    	
    	public monThread1 ()
    	{
    		Thread th = new Thread (new ThreadStart (this.Run));
    		Console.WriteLine ("monThread1 démarre");
    		th.Start();
    	}
     
    	public void Run ()
    	{
    		int i = 0;
    		while (i < 100) {
    			Console.Write (".");
    			Thread.Sleep (1000);
    			i++;
    		}
    	}
    
    }
    public class monThread2
    {
    	public monThread2 ()
    	{
    		Thread th = new Thread (new ThreadStart (this.Run));
    		Console.WriteLine ("monThread2 démarre");
    		th.Start();
    	}
     
    	public void Run ()
    	{
    		while (true) {
    			ConsoleKeyInfo x = new ConsoleKeyInfo ();
    			x = Console.ReadKey ();
    			if (x.KeyChar == 'y') {
    				Console.Write("'t2:y'");
    				/*if (Evenement != null)
    					Evenement ("!Y!");*/
    			}
    			Thread.Sleep (100);
    		}
    	}
    }
    
    
    public class thread_evenement
    {
    
    	static public monThread1 t1;
    	static public monThread2 t2;
    	
    	public static void Main (string[] args)
    	{
    		t1 = new monThread1 ();
    		t2 = new monThread2 ();
    		
    	}
    	
    	public void Evenement ()
    	{
    		Console.WriteLine ("\nTouche y préssée dans thread2\n");
    	}
    	
    }
    



    Merci d'avance :$
    • Partager sur Facebook
    • Partager sur Twitter
    Ne vous inscrivez surtout pas aux certifications. Pas crédibles, payantes, et aucun suivi en cas de bug.
      23 mars 2012 à 10:29:11

      Tu peux trouver des infos sur les événements dans mon tutoriel C# http://www.siteduzero.com/tutoriel-3-5 [...] -lambdas.html
      • Partager sur Facebook
      • Partager sur Twitter
        23 mars 2012 à 10:31:14

        Je viens de le lire, et ça m'a pas vraiment aidé, voir meme embrouillé un peu plus :/


        je me suis fait un exemple tout basique, ça été, par contre, là, avec les 2 threads, j'arrive plus ...
        • Partager sur Facebook
        • Partager sur Twitter
        Ne vous inscrivez surtout pas aux certifications. Pas crédibles, payantes, et aucun suivi en cas de bug.
          23 mars 2012 à 11:24:28

          C'est pas le but que ça embrouille :waw:

          Pourquoi tu ne gères pas l'événement dans ton thread 2 ?

          class Program
          {
              static public monThread1 t1;
              static public monThread2 t2;
          
              public static void Main(string[] args)
              {
                  t1 = new monThread1();
                  t2 = new monThread2();
                  t2.evenement += t2_evenement;
          
              }
          
              static void t2_evenement(string message)
              {
                  Console.WriteLine("Touche recue : " + message);
              }
          }
          
          public class monThread1
          {
              public monThread1()
              {
                  Thread th = new Thread(Run);
                  Console.WriteLine("monThread1 démarre");
                  th.Start();
              }
          
              public void Run()
              {
                  int i = 0;
                  while (i < 100)
                  {
                      Console.Write(".");
                      Thread.Sleep(1000);
                      i++;
                  }
              }
          
          }
          public class monThread2
          {
              public delegate void DelegateEvenement(string message);
          
              public event DelegateEvenement evenement;
          
              public monThread2()
              {
                  Thread th = new Thread(Run);
                  Console.WriteLine("monThread2 démarre");
                  th.Start();
              }
          
              public void Run()
              {
                  while (true)
                  {
                      ConsoleKeyInfo x = Console.ReadKey();
                      if (x.KeyChar == 'y')
                      {
                          Console.Write("'t2:y'");
                          if (evenement != null)
                              evenement("!Y!");
                      }
                      Thread.Sleep(100);
                  }
              }
          }
          
          • Partager sur Facebook
          • Partager sur Twitter
            23 mars 2012 à 12:17:33

            Heuuu :o

            La seule chose que tu as faite c'est ajouter le : t2.evenement += t2_evenement; ???

            C'est juste ça ??? :o je suis choqué, je vais bien comparer. Parce que cette ligne je l'ai mise partout, et ça ne fonctionnait jamais :s
            • Partager sur Facebook
            • Partager sur Twitter
            Ne vous inscrivez surtout pas aux certifications. Pas crédibles, payantes, et aucun suivi en cas de bug.
              23 mars 2012 à 14:21:47

              En fait,la méthode doit être static pour que tu puisse l'appeler en mode console en faisant:
              t2.evenement += t2_evenement ;
              

              Ce qui n'est pas le cas en WinForm
              • Partager sur Facebook
              • Partager sur Twitter
                25 mars 2012 à 18:48:30

                Merci, maintenant que mon code fonctionne, je comprends mieux le procédé.

                • Partager sur Facebook
                • Partager sur Twitter
                Ne vous inscrivez surtout pas aux certifications. Pas crédibles, payantes, et aucun suivi en cas de bug.

                delegate event

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown