Problème avec la gestion des thread: thread appelé deux fois seulement au lieu d
cs_AmK
Messages postés368Date d'inscriptionjeudi 13 mars 2003StatutMembreDernière intervention27 janvier 2010
-
1 mai 2008 à 14:40
cs_coq
Messages postés6351Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014
-
1 mai 2008 à 18:24
Bonjour,
J'ai un gros problème avec l'utilisation des thread!
En fait, ce qui se passe c'est que j'appelle un thread 15fois ! ( 15positions successives à afficher sur une map obtenue à l'aide du webservice MapPoint ). 15fois en principe, en réalité il n'est appellé que 2 fois, pour des raisons inconnues..
Je vous mets le code :
int nb_positions=0; // variable globale qui sera mise à jour à chaque cycle du
threa
private void DoUpdate(int nb_positions)
{
i
= i + 1;
if (this.InvokeRequired)
{
// we were called on a worker thread
//
marshal the call to the user interface thread
this.Invoke(new
CallPositionsThreadingDelegate(DoUpdate), new object[] { nb_positions
});
return;
}
menuItem1.Text = "Appel"+" "+i.ToString(); // Le compteur se
bloque à 2, ce qu signifie que
// le thread n'est appelé que
deux fois
cs_coq
Messages postés6351Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014100 1 mai 2008 à 15:10
Salut,
Je n'ai pas vraiment compris le déroulement du code mais à vue de nez tu lances une fois, elle se rappelle elle même en changeant de contexte de thread et c'est tout.
Bref, je dirais qu'il doit manquer une boucle quelquepart, sans doute dans CallPositionsThreading si j'en juge par le commentaire "//tant que nb_positions est <15 on continue d'appeler DoUpdate"
Pour le code, desolé je confirme c'est illsible ya pas moyen d'insérer une balise snippet ici ?
Cela dit, je te fournis une explication sommaire du code :
// Création du thread et lancement de ce thread
// Après clic sur menuItem2
private void menuItem2_Click(object sender, EventArgs e)
// Appel du thread en question
private void CallPositionsThreading()
// Le thread et son delegué
private delegate void CallPositionsThreadingDelegate(int nb_positions);
private void DoUpdate(int nb_positions)
// la méthode qui affiche la map avec mappoint
// en fait elle fait un appel asynchrone à
// une webmethode (GetMap)
private void DisplayMapFromCoordinates(...);
// traitement asynchrone de GetMap
private void GetMapThread(IAsyncResult state)
// pour l'affichage de la map sur une picturebox
private delegate void UpdatePictureBoxDelegate();
private void UpdatePictureBox()
Donc en gros ya deux thread dans mon code.A savoir qu'un premier thread est lancé et que ce
thread va lui même lancer un autre thread ( du moins avec un appel asynchrone de webservice).
cs_coq
Messages postés6351Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014100 1 mai 2008 à 17:39
Sauf si un autre thread joue avec la valeur de i, la seule raison serait un échec dans DisplayMapFromCoordinates entrainant l'arrêt du thread dès le premier appel (la position de l'incrémentation de i faisant en sorte qu'en cas d'Invoke, il est incrémenté 2 fois pour un seul appel de DisplayMapFromCoordinates).
cs_AmK
Messages postés368Date d'inscriptionjeudi 13 mars 2003StatutMembreDernière intervention27 janvier 20101 1 mai 2008 à 17:52
Cet échec surviendrait donc lors du deuxième appel?
Curieux, pourtant chaque appel est similaire au premier, il n'y a que la position à afficher qui change, je vois vraiment où est ce que ça pourrait clocher :(.