Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Problème avec la gestion des thread: thread appelé deux fois seulement au lieu de 15 :( [ Windows / Process ] (AmK)

jeudi 1 mai 2008 à 14:40:33 | Problème avec la gestion des thread: thread appelé deux fois seulement au lieu de 15 :(

AmK

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 :( ..  

jeudi 1 mai 2008 à 15:10:57 | Re : Problème avec la gestion des thread: thread appelé deux fois seulement au lieu de 15 :(

coq

Administrateur CodeS-SourceS
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
*/

jeudi 1 mai 2008 à 16:06:02 | Re : Problème avec la gestion des thread: thread appelé deux fois seulement au lieu de 15 :(

AmK

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


jeudi 1 mai 2008 à 16:27:10 | Re : Problème avec la gestion des thread: thread appelé deux fois seulement au lieu de 15 :(

coq

Administrateur CodeS-SourceS
heu, i se trouve où ?



/*
coq
MVP Visual C#
CoqBlog
*/

jeudi 1 mai 2008 à 17:32:19 | Re : Problème avec la gestion des thread: thread appelé deux fois seulement au lieu de 15 :(

AmK

i, variable globale initialisée à 0.  

jeudi 1 mai 2008 à 17:39:42 | Re : Problème avec la gestion des thread: thread appelé deux fois seulement au lieu de 15 :(

coq

Administrateur CodeS-SourceS
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
*/

jeudi 1 mai 2008 à 17:52:33 | Re : Problème avec la gestion des thread: thread appelé deux fois seulement au lieu de 15 :(

AmK


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

jeudi 1 mai 2008 à 18:06:20 | Re : Problème avec la gestion des thread: thread appelé deux fois seulement au lieu de 15 :(

coq

Administrateur CodeS-SourceS
Non, dès le premier.



/*
coq
MVP Visual C#
CoqBlog
*/

jeudi 1 mai 2008 à 18:16:26 | Re : Problème avec la gestion des thread: thread appelé deux fois seulement au lieu de 15 :(

AmK

Mmm très bien merci !
Reste à savoir pourquoi.. je vais m'y pencher..   

jeudi 1 mai 2008 à 18:24:08 | Re : Problème avec la gestion des thread: thread appelé deux fois seulement au lieu de 15 :(

coq

Administrateur CodeS-SourceS
Bon courage.



/*
coq
MVP Visual C#
CoqBlog
*/



Cette discussion est classé dans : private, void, thread, nb, positions


Répondre à ce message

Sujets en rapport avec ce message

[C#] Problème de Thread [ par leodrel56 ] Bonsoir à tous !!!Voilà je me suis mis au C# ce matin et je rencontre quelques petits soucis, voilà premièrement dans mon pseudo programme j'initialis Appli qui tourne normal sur Visual Studio 2005, et plante quand je lance l'exe seul [ par duteux ] Bonjour à tous, J'ai ecrit une application Windows en C# qui parcour les fichiers *.eml pour en extraire toutes les adresses mails présentes. Quand Thread mon programme plante :( [ par badrbadr ] Salut tout le monde,Je suis en train de travailler sur une application qui prend des captures d'écran de pages web. J'utilise pour cela le contrôle We Operation interThread non valide : utilisation des delegates [ par Zaltez ] Bonsoir,J'aurai besoin d'un précision sur l'utilisation des delegates en c#.j'utilise les delegates pour rafraichir l'avancement du progressbar de cet Problème D'impression [ par maxdesu ] bonjour a tous j'ai un probleme d' impression desolé car il y a des autres sujets que j'ai deja aperçu dont celui la http://www.csharpfr.com/codes/TUT A propos de backgroundWorker [ par sliverman ] Bonjour à tous, alors voila j'essaye de faire des exemple de code pour comprendre le composant backgroundWorker.Donc j'ai un ListView, un progressbar Modifier une textbox dans une class [ par yanis7518 ] Salut a tousvoila je voudrai savoir si il est possible de modifier la valeur d'une textbox à partir d'une fonction appartenant a une class. Et si oui Thread Events Invoke --> Je rends les armes .... [ par ylerazer ] Bonjour, je suis nouveau en C# et j'essaie de me faire des classes intelligentes .. mais j'ai bien peur qu'elles ne soient plus intelligentes que moi. Probleme fermeture thread,je trouve pas mon erreur :( [ par fcolo ] Bonjour,j'ai une application principale qui appelle un composant d'une autre classe.Ce composant envois à intervale régulier une image au travers d'un Forcer l'activité d'une thread [ par Capitaine Iron ] Bonjours, alors voila ce que je voudrais faire:Je cré un objet qui instentie une icone de notification qui reste bien sagement en attente de recevoir


Nos sponsors

Sondage...

CalendriCode

Novembre 2008
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,296 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.