C#Threads

Ceci est un exemple implé mentant deux exemples de threading en C#. Vous pourrez comparer par vous-mêmes avec des programmes é quivalents dans les langages que vous connaissez.

Pour repré senter un signal d'arrêt, nous utiliserons une petite classe Signal maison, encapsulant un signal boolé en (pas ce qu'il y a de plus souple, soit, mais ça fera le boulot pour le moment).

using System;
using System.Threading;

namespace TiPoints
{
   class Signal
   {
      private bool reçu;
      public Signal()
      {
         reçu = false;
      }
      public void Signaler()
      {
         reçu = true;
      }
      public bool Tester()
      {
         return reçu;
      }
   }
   

Une classe TiPoints repré sentera, avec sa mé thode d'instance Exé cuter(), l'acte d'afficher un petit point à la console jusqu'à ce qu'un signal d'arrêt lui soit envoyé .

   class TiPoints
   {
      private Signal signal;
      public TiPoints(Signal sig)
      {
         if (sig == null)
            throw new ArgumentException();
         signal = sig;
      }
      public void Exécuter()
      {
         while (!signal.Tester())
         {
            Console.Write(".");
            Thread.Sleep(1000);
         }
      }
   }

Un thread en C# est un dé lé gué sur une mé thode void ne recevant pas de paramètre. Dans le programme principal, nous en voyons deux exemples simples :

  • la mé thode ExempleA() utilise la mé thode d'instance Exé cuter() d'un TiPoints à titre de thread, et lit une touche dans le code ayant lancé ce thread, puis attend sa complé tion (invocation de Join(), comme dans le monde POSIX); et
  • la mé thode ExempleB() utilise la mé thode de classe LireUneTouche() à titre de thread, ce qui impose (dans ce cas-ci) le recours à un Signal accessible à une telle mé thode.

Concrètement, on choisira l'approche qui nous convient.

   class Program
   {
      static bool ExempleA()
      {
         Signal signal = new Signal();
         TiPoints tp = new TiPoints(signal);
         Thread th = new Thread(tp.Exécuter);
         th.Start();
         Console.Read();
         signal.Signaler();
         th.Join();
         return true;
      }
      static Signal signalGlobal = new Signal();
      static void LireUneTouche()
      {
         Console.Read();
         signalGlobal.Signaler();
      }
      static bool ExempleB()
      {
         TiPoints tp = new TiPoints(signalGlobal);
         Thread th = new Thread(LireUneTouche);
         th.Start();
         tp.Exécuter();
         th.Join();
         return true;
      }
      static void Main(string[] args)
      {
         Console.WriteLine
            ("Exemple avec délégué sur une méthode d'instance");
         ExempleA();
         Console.WriteLine
            ("Exemple avec délégué sur une méthode de classe");
         ExempleB();
      }
   }
}

Valid XHTML 1.0 Transitional

CSS Valide !