Aller au contenu

Multi-Threading


Wolfae

Messages recommandés

Niveau requis Intermédiaire

Temps estimé : 30 minutes

Bonjour,

 

Me revoilà avec un autre mini-tutoriel, cette fois sur le multi-threading en C#. Contrairement à ce que certains pensent, le multi-threading est assez simple, mais, une seule faute de votre part et vous voilà dans un trou profond. Ce tutoriel n'expliquera que les bases du multi-threading mais est essentiel si vous voulez arriver à quelque chose.

 

Révélation

 

Voici un exemple de programme console :

//Program.cs

using [...]

namespace TestThreading
{
   class Program
   {
      static void Main()
      {
        Console.WriteLine("Test sans Threads.");
        AutreBoucle();
        for(int i = 0; i <= 10; i++)
        {
          Console.WriteLine(i.ToString());
          Thread.Sleep(250);
        }
      }

      public void AutreBoucle()
      {
         for(int i = 0; i <= 10; i++)
         {
            Console.WriteLine("Boucle 2: {0}", i.ToString());
            Thread.Sleep(500); // Pour constater la différence plus tard
         }
      }
   }
}
Résultat :
Boucle 2: 0
Boucle 2: 1
Boucle 2: 2
Boucle 2: 3
Boucle 2: 4
Boucle 2: 5
Boucle 2: 6
Boucle 2: ... (Jusqu'à 10)
0
1
2
3
4
5
6
... (Jusqu'à 10)
Ici, on peut voir que chaque boucle se fait séquentiellement : La boucle 2, puis la première boucle. Si on souhaite que les deux se font en même temps, le threading s'impose :
//Program.cs

using [...]
using System.Threading; // THREADING

namespace TestThreading
{
   class Program
   {
      static void Main()
      {
        Console.WriteLine("Test sans Threads.");
        ThreadStart threadst = new ThreadStart(AutreBoucle);
        Thread worker = new Thread(threadst);
        worker.Start();
        for(int i = 0; i <= 10; i++)
        {
          Console.WriteLine(i.ToString());
          Thread.Sleep(250);
        }
      }

      public void AutreBoucle()
      {
         for(int i = 0; i <= 10; i++)
         {
            Console.WriteLine("Boucle 2: {0}", i.ToString());
            Thread.Sleep(500); // Pour constater la différence plus tard
         }
      }
   }
}
J'explique ce que j'ai ajouté : D'abord évidemment, une directive using System.Threading; C'est le namespace System.Threading pour éviter les répétitions longues et inutiles.

 

Puis, j'instancie une var de type ThreadStart, nommée threadst. new ThreadStart(AutreBoucle); < J'ai défini comme paramètre, le nom de la méthode. Ensuite vient le Thread : Thread worker = new Thread(threadst); Comme paramètre du constructeur d'un thread, un ThreadStart. Vous pouvez très bien écrire :

Thread worker = new Thread(new ThreadStart(AutreBoucle));
Ici, c'était simplement pour mieux expliquer. Bref, on débute le thread (Thread.Start()) et voilà. Résultat :
Boucle 2: 0
0
1
Boucle 2: 1
2
3
Boucle 2: 2
4
5
Boucle 2: 3
6
7
Boucle 2: 4
8
9
Boucle 2: 5
10
Boucle 2: 6
Boucle 2: 7
... (Jusqu'à 10.)
Et voilà, les deux fonctionnent en même temps.

 

 

En fait, les "Multithreaded applications" (Applications à threads multiples..), c'est bien, mais il est nécessaire de les utiliser seulement quand on en a besoin. Si par exemple, la méthode A utilise la variable publique PUBLICVAR, et la méthode B, qui fonctionne en même temps, sur un thread séparé, modifie PUBLICVAR...

 

Je ne pourrai pas vous dire l'apocalypse qui se passerait. Conclusion du mini-tutoriel : Le threading est un atout intéressant mais à manipuler avec précaution (Plus ou moins) pour des applications performantes, rapides et qui ne bloquent pas l'utilisateur d'ouvrir, par exemple, les options.

 

Cordialement,

Heaven Team 2012

Non mudera, potius mori quam foedari.

 

Connaissances : C#, VB.net, JavaScript, PHP

Libre service.

Lien vers le commentaire
  • 2 months later...
  • Réponses 4
  • Created
  • Dernière réponse
  • 2 years later...

Malgré les deux ans du topic (c'est le premier topic de ce forum de toutes façons), je me permets un up pour un petit ajout.

 

Le multi threading n'est pas si dangereux que ça, grâce à la méthode lock() il est possible de "sécuriser" son code en quelques sortes, elle permet de bloquer l’accès à un bout de code si ce dernier est en cours d'utilisation (le thread qui se voit bloqué par lock() se met à attendre que la partie de lock soit libre).

Lien vers le commentaire
  • 1 month later...

Malgré les deux ans du topic (c'est le premier topic de ce forum de toutes façons), je me permets un up pour un petit ajout.

Le multi threading n'est pas si dangereux que ça, grâce à la méthode lock() il est possible de "sécuriser" son code en quelques sortes, elle permet de bloquer l’accès à un bout de code si ce dernier est en cours d'utilisation (le thread qui se voit bloqué par lock() se met à attendre que la partie de lock soit libre).

 

Ou alors tu peux simplement utiliser la propriété InvokeRequired, de la façon suivante :

if (this.lblText.InvokeRequired)
this.lblText.Invoke(new Action() => this.lblText.Text = "lol"; ));
else
this.lblText.Text = "lol";

 

Ou encore les delegates :

delegate void mySuperThreadDelegate();
private void mySuperThread()
{
// Si on est pas dans les thread principal, alors on passe par un delegate.
if (this.InvokeRequired)
{
	BeginInvoke(new mySuperThreadDelegate(mySuperThread));
	return;
}

this.lblText.Text = "lol";
}

Lien vers le commentaire
  • 1 year later...

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant


  • Flux d'Activité

    1. 5

      Metin2 Download - Migration

    2. 0

      C++ Wiki Ingame

    3. 38

      Installer Ancestra Remake 54

    4. 2

      Ajouter une Commande Lau

    5. 2

      Ajouter une Commande Lau

    6. 2

      Ajouter une Commande Lau

    7. 38

      Installer Ancestra Remake 54

    8. 5

      Metin2 Download - Migration

    9. 3

      L'E3 2021, on en parle !

  • En ligne récemment

    Aucun utilisateur enregistré regarde cette page.

×
×
  • Créer...

Information importante

Conditions d’utilisation / Politique de confidentialité / Règles / Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.