cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 2007
-
21 avril 2006 à 16:01
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 2007
-
26 avril 2006 à 09:29
Bonjour,
je réalise une application (pour le fun) qui lance 100 thread en parallele.
Chaque thread devra exécuter le même code.
Dans ce code, je veux lancer une connection TCP vers une camera IP, mon but étant de savoir à quel moment le serveur de la caméra plantera (j'espere pas irrémédiablement).
J'ai donc réalisé rapidement (toute la matinée quand meme...) mon application graphique.
Avec 4 textBox/label (url, user, pass, nbMax de thread en cours), un bouton (lancer/arreter) et une listBox (affichage des thread en cours d'exécution).
Je lance donc un premier thread qui me permet de lancer en boucle les nbMax thread supplémentaire. C'est lui qui s'assure du nombre de thread lancé.
Chaque fois qu'un thread est lancé, j'ai une variable (un int) qui s'incrémente et je donne cette valeur pour le nom du thread. J'insère ce nom dans la listBox.
Lorqqu'un thread ce termine normalement, il enleve son nom de la listBox est décrémente le nombre de thread en court pour permettre le lancement d'un autre thread.
Je veux rajouter l'option à l'utilisateur ( moi comme je ne vais pas le distribuer ) de pouvoir arreter un thread depuis la listBox.
Je me suis donc inscrit à l'evenement SelectedValueChanged de la listBox pour récupérer l'index et le nom du thread.
Avec le nom, je souhaiterai pouvoir arreter ce thread mais je ne sais pas comment faire.
Je ne sais pas si j'ai bien expliquer en fait ...
//
//clic sur le bouton
//
void
Button1Click (object sender, System.EventArgs e
)
{
if (!attacking
)
{
button1.Text = "Stop"
;
label1.Enabled = false
;
label2.Enabled = false ;
label3.Enabled = false
;
textBox1.Enabled = false ;
textBox2.Enabled = false
;
textBox3.Enabled = false ;
textBox4.Enabled = false
;
attacking = true ;
this.url= textBox1.Text
;
this .user = textBox2.Text
;
this.pass = textBox3.Text
;
this .nbMax = Convert.ToInt32 (textBox4.Text
);
Thread thread_attack = new Thread
(new ThreadStart (runAttack
));
thread_attack.Start ();
}
else
{
button1.Text = "attaquer"
;
label1.Enabled = true
;
label2.Enabled = true ;
label3.Enabled = true
;
textBox1.Enabled = true ;
textBox2.Enabled = true
;
textBox3.Enabled = true ;
textBox4.Enabled = true
;
attacking = false ;
}
}
//
//fonction runattack
//
private
void runAttack ()
{
while (attacking
)
{
if (nbThread<nbMax
)
{
Thread t_attack = new Thread
(new ThreadStart (attack
));
if (MessageBox.Show ("Arreter le thread?","Action",MessageBoxButtons.YesNo)= =DialogResult.Yes
)
{
((
Thread)listBox1.Items[listBox1.SelectedIndex]). Abort
(); // << == l'objet n'est pas mon thread mais son nom
}
}
Si vous avez une idée comment faire, je voudrais m'éviter en fait de faire un tableau de thread en cours pour ne pas à devoir boucler afin de retrouver le thread selectionné.
J'espere qu'il y a une solution.
Nikoui
Messages postés794Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention19 août 200813 21 avril 2006 à 18:33
Plutot que de faire un tableau - et devoir le parcourir pour retrouver ton thread, pourquoi ne pas utiliser une table de hashage ? (une collection dans laquelle tu stocke les éléments en leur affectant une clé. Tu peux ensuite récupérer un élément directement à partir de sa clé).
Si tu es en .Net 1 : Hashtable
Si tu es en .Net 2 : Dictionary