Controler un thread en ne connaissant que son nom

Résolu
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 - 21 avril 2006 à 16:01
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 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
));

t_attack.Start
();
}

}

}

//
//fonction attack
//


private
void attack
()
{

if
(nbThread<nbMax
)
{

Thread.CurrentThread.Name = Convert.ToString
(newThread
(true
));

this.Invoke
(new insertThreadList
(threadList),Thread.CurrentThread,true
);

Thread.Sleep
(10000
);

supprimeThread
(Thread.CurrentThread
);
}

}

//
//delegate
//
public
void threadList
(Thread thread, bool
ajout
)
{

if
(ajout) listBox1.Items.Add
(thread.Name
);

else
listBox1.Items.Remove
(thread.Name
);
}

//
//fonction ListBox1SelectedValueChanged
//
void
ListBox1SelectedValueChanged
(object sender, System.EventArgs e
)
{

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.

Merci

f.colo

2 réponses

Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
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
3
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 2
26 avril 2006 à 09:29
Effectivement ca fonctionne:

//declaration
private Dictionary <String, Thread> h;

//creation
h = new Dictionary <String, Thread>();

listBox1.Items.Add(thread.Name);
//affectation
h.Add(thread.Name, thread);

//récupération
thread T = h[(String)listBox1.SelectedItem]

listBox1.Items.Remove(thread.Name);
//suppression
h.Remove(thread.Name);

Merci du conseil, je ne connaissais pas du tout les tables de hashage ou dictionnaires.

f.colo
0
Rejoignez-nous