Problème avec la gestion des thread: thread appelé deux fois seulement au lieu d

cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 - 1 mai 2008 à 14:40
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Derniè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 menuItem2_Click(object sender, EventArgs
e)
        {
  
             // Le thread est lancé lors de
l'évenement : clic sur menuItem2
              monThread = new Thread(new
ThreadStart(CallPositionsThreading));

              monThread.Start();
        }

       private void CallPositionsThreading()
        {
    

            if (nb_positions < 15)
            {
             
  //tant que nb_positions est <15 on continue d'appeler
DoUpdate
                DoUpdate(nb_positions);
               
nb_positions = nb_positions + 1;
            }

      
        }

        private delegate void CallPositionsThreadingDelegate(int
nb_positions);

        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

            DisplayMapFromCoordinates(DriverCarList,pictureBox2.Height,
pictureBox2.Width);
    

        }

        DisplayMapFromCoordinates(...)
       {
           // Appel
asynchrone vers GetMap
       } 

      private void GetMapThread(IAsyncResult state)
       
{
            RenderServiceSoap rss = state.AsyncState as
RenderServiceSoap;
            if (rss == null)
               
return;
            MapImage[] images = rss.EndGetMap(state);
           
imageStream = new System.IO.MemoryStream(images[0].MimeData.Bits);

            if (pictureBox2.InvokeRequired)
           
{
                pictureBox2.Invoke(new
UpdatePictureBoxDelegate(UpdatePictureBox));
            }
           
else
            {
                UpdatePictureBox();
           
}

        }

        private delegate void UpdatePictureBoxDelegate();

        private void UpdatePictureBox()
        {

            pictureBox2.Image = new System.Drawing.Bitmap(imageStream);

        }

A votre avis, à quoi est ce du ??

Je vous remercie pour votre aide, j'y suis dessus depuis pas mal de temps et je commence vraiment à desesperer :( ..  

9 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
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"

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 1
1 mai 2008 à 16:06
A vrai dire j'avais utilisé une boucle for avant cela :

for(nb_positions=0;nbpositions<15;nb_positions++)
   DoUpdate(nb_positions);

mais le résultat était le même.

Oui le thread est appelé une fois et c'est tout.

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).

Merci beaucoup :)  
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
1 mai 2008 à 16:27
heu, i se trouve où ?

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 1
1 mai 2008 à 17:32
i, variable globale initialisée à 0.  
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
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).

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 1
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 :(.

Merci pour ton aide :)  
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
1 mai 2008 à 18:06
Non, dès le premier.

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 1
1 mai 2008 à 18:16
Mmm très bien merci !
Reste à savoir pourquoi.. je vais m'y pencher..   
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
1 mai 2008 à 18:24
Bon courage.

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous