Lancer plusieurs Threads à la fois

Signaler
Messages postés
89
Date d'inscription
mardi 19 janvier 2010
Statut
Membre
Dernière intervention
21 juin 2016
-
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Statut
Membre
Dernière intervention
21 décembre 2012
-
Bonjour,
j'essaye de lancer plusieurs threads à la fois et j'ai l'impression que il n'y en as qu'un seul qui part... et donc pas de parallelisme effectif.

un bout de code est beaucoup plus parlant:
private static bool __stop = false;
private static void Main(args[])
{
      Thread[] myThreads = new Thread[5];
      for (int i = 0; i<myThreads.length; {
           Thread myThread = new Thread(new ThreadStart(DoWork));
           myThread.Name = i.ToString();
           myThread.Start();
      }
}
private static void DoWork()
{
      while(!__stop){
            console.WriteLine("current thread : {0}", Thread.CurrentThread.Name);
      }

}


j'ai fait expres de faire une boucle infinie en pensant que tous les threads se lanceront tous d'un coup... sauf que la je n'ai que le premier qui s'affiche à chaque fois. ce qui me fait penser qu'il attend la fin pour lancer le deuxième :(

merci pour votre aide.

9 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Dans ton code, i n'augmente jamais. Il crée donc une infinité de threads qui s'appellent "0" et qui font une boucle infinie.
De plus, ton code ne compile pas.

Avec ce code, ça fonctionne :
private static bool __stop = false;
private static void Main(string[] args)
{
    Thread[] myThreads = new Thread[5];
    for (int i = 0; i < myThreads.Length; i++)
    {
        Thread myThread = new Thread(new ThreadStart(DoWork));
        myThread.Name = i.ToString();
        myThread.Start();
    }
}
private static void DoWork()
{
    while (!__stop)
    {
        Console.WriteLine("current thread : {0}", Thread.CurrentThread.Name);
    }
}


Je te conseille également de faire un Thread.Sleep()

private static bool __stop = false;
private static Random rand = new Random();
private static void Main(string[] args)
{
    Thread[] myThreads = new Thread[5];
    for (int i = 0; i < myThreads.Length; i++)
    {
        Thread myThread = new Thread(new ThreadStart(DoWork));
        myThread.Name = i.ToString();
        myThread.Start();
    }
}
private static void DoWork()
{
    while (!__stop)
    {
        Console.WriteLine("current thread : {0}", Thread.CurrentThread.Name);
        Thread.Sleep(rand.Next(5000));
    }
}


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
89
Date d'inscription
mardi 19 janvier 2010
Statut
Membre
Dernière intervention
21 juin 2016
2
merci mais c'est bien ce que j'avais, c'est mon copié collé qui n'a pas marché.
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Bah chez moi ça marche très bien.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
89
Date d'inscription
mardi 19 janvier 2010
Statut
Membre
Dernière intervention
21 juin 2016
2
en fait, ça marche bien, sauf que je met une vraie fonction doWork, la pour le coups, ca passe un par un... je n'y comprend rien.
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Tu es sûr que ce n'est pas parce que ta méthode DoWork se fait tellement vite que tu ne vois pas la parallélisation ?

Pour vérifier, mets un Sleep aléatoire comme montré dans le dernier code que je t'ai envoyé. Tu verras bien si les threads sont en parallère ou à la suite.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
89
Date d'inscription
mardi 19 janvier 2010
Statut
Membre
Dernière intervention
21 juin 2016
2
non, comme j'ai un compteur je vois bien que je ne traite pas plusieurs éléments à la fois.

dans mon dowork, je lis une page web et je récupère les liens (donc ca prend un peu de temps sans le sleep.

PS: j'ai essayé avec un sleep(1000), à part ralentir le programme, ça ne le fait pas aller plus vite
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Non, le but est de faire un sleep aléatoire, afin que ton deuxième thread puisse passer avant ton premier.

Ou, plus simple, tu fais effectivement ton Sleep(1000) UNE fois dans chaque thread. Si tu as 10 threads et que ton programme est ralenti d'une seconde, c'est que les threads étaient en parallèle. Si ton programme est ralenti de 10 secondes, c'est que tes threads ne sont pas exécutés en même temps.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
89
Date d'inscription
mardi 19 janvier 2010
Statut
Membre
Dernière intervention
21 juin 2016
2
waw, y a un truc que je ne comprend pas :)

j'ai suivi ton conseille (merci au passage) et ai mis un sleep(1000) apres chaque thread et ca fonctionne !! le programme lance tous les thread et je vois bien la différence à l'écran. si je commente cette ligne, j'ai toujours le meme thread qui tourne (je le vois car mon conteur ne s'incrémente que de 1 à chaque fois). tu peux peut etre m'expliquer car en gros mon sleep accèlere le programme alors qu'il est sensé le ralentir...
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Statut
Membre
Dernière intervention
21 décembre 2012
1
Salut !

Y'a un petit détail qui me chagrine dans ton code :
Tu instancie un tableau de threads (myThreads), puis dans ta boucle for tu crées de nouveaux Thread myThread en laissant en plan ce pauvre tableau tout beau !

Sinon pour l'histoire d'accélérer ton programme à coups de Sleep (dit comme ça, c'est vrai que c'est un peu absurde ^^), ça dépend pas mal ce qu'il y a précisément dans ton DoWork, et de l'endroit où tu as mis ton Sleep, je dirais !
Peut-être que chaque Thread essai d'accéder à un serveur en même temps, ce qui prend pas mal de temps, alors que si tu les fait attendre 1s entre 2 requêtes au serveur, ça laisse du temps aux autres threads pour s'exécuter ???
Ou une bêtise du genre...
Ou je dis que des bêtises ^^

Mad Keyboard