Bonjour,
J'ai développé aujourd'hui une partie de mon application avec les threads, j'ai déjà un peu de vécu avec les pthreads du c/c++ mais là c'est bien la première fois que je me lance dans le c# avec un problème bien concret.
J'ai en gros 100 calculs à réaliser j'ai décidé de les diviser en 4 threads de la manière suivante :
Ma fonction ChoisirThread est une simple suite de condition :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 //Création des threads thread1 = new Thread(new ParameterizedThreadStart(routineThreadMatch)); thread2 = new Thread(new ParameterizedThreadStart(routineThreadMatch)); thread3 = new Thread(new ParameterizedThreadStart(routineThreadMatch)); thread4 = new Thread(new ParameterizedThreadStart(routineThreadMatch)); thread1.IsBackground = true; thread2.IsBackground = true; thread3.IsBackground = true; thread4.IsBackground = true; while (m.Read()) { //Note pt est bien déclaré il s'agit d'une classe perso contenant 5 attributs je ne l'affiche pas pour alléger le code ChoisirThread(pt);//La fonction va choisir un thread et lancer la simu while (thread1.IsAlive && thread2.IsAlive && thread3.IsAlive && thread4.IsAlive) ; //On attend qu'un thread soit libre } m.Dispose();
Enfin la "routine" de mon thread :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 if (!thread1.IsAlive) { thread1.Start(pt); } else if (!thread2.IsAlive) { thread2.Start(pt); } else if (!thread3.IsAlive) { thread3.Start(pt); } else if (!thread4.IsAlive) { thread4.Start(pt); }
En fait mes 4 threads se lancent mais l'application bloque ensuite sur la boucle, avec des breakspoints j'ai bien vu que chaque thread arrivait bien à la fin de sa fonction pour invoquer le delegate de la progressBar (je ne sais pas si la progressBar a avancé, peut etre un problème de raffraichissement suite à cette boucle infinie).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 try { System.Data.SqlServerCe.SqlCeConnection connev = new System.Data.SqlServerCe.SqlCeConnection(connexion_bdd.ConnexionString); connev.Open(); Simuler(pt.id); connev.Close(); connev.Dispose(); } catch (Exception pb) { calculs.Erreur("Probleme routineThreadmatch"+ pb.Message); } try { //On invoque le delegate pour la progressbar Invoke((AugmenterProgressBar)Progres, 0); } catch (Exception ex) { return; } Thread.CurrentThread.Abort();//j'ai essayé avec ça à la fin de la fonction ça me semblait barbare mais ça ne change rien
Je conçois bien que cette boucle n'est pas forcément très jolie jolie... Si vous avez une autre solution je suis preneur. Dans tous les cas la propriété isalive ne revient jamais à false, peut etre que j'ai mal du comprendre son utilité ?
J'ai bien entendu parler de la fonction Join, mais je ne vois pas trop comment l'appliquer dans ce cas.
Je débute avec la gestion de ces threads j'ai du omettre un simple détail, si vous pouviez m'aider...
Merci d'avance,
Partager