IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Mise à jour TreeView à partir de différents thread


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Mise à jour TreeView à partir de différents thread
    Bonjour

    J'ai une application multithread qui doit faire une mise à jour d'une treeView.
    Comme la mise à jour se fait à partir de plusieurs thread différents, j'ai du utiliser la fonction InvokeRequired pour que le code fonctionne (j'ai découvert ça dans msdn).
    Le morceau de code implémené dans ma Form est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
            delegate int addMyMessageNodeCallback(int indexNode, MyMessage request);
     
            public int addMyMessageNode(int indexNode, MyMessage request)
            {
                int index;
     
                if (this.treeView1.InvokeRequired)
                {
                    addMyMessageNodeCallback d = new addMyMessageNodeCallback(addMyMessageNodeMethod);
                    index = (int)(this.Invoke(d, new object[] { indexNode, request }));
                }
                else
                {
                    index = addMyMessageNodeMethod(indexNode, request);
                }
                return index;
            }
    La pluspart du temps, tout se passe bien. Mais de temps en temps, j'ai le message d'erreur suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    L'argument spécifié n'était pas dans les limites de la plage des valeurs valides.
    Nom du paramètre : index
    L'exception System.ArgumentOutOfRangeException n'a pas été gérée
      Message="L'argument spécifié n'était pas dans les limites de la plage des valeurs valides.\r\nNom du paramètre*: index"
      Source="System.Windows.Forms"
      ParamName="index"
      StackTrace:
           à System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
           à System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
           à Proxy.Form1.addMyMessageNode(Int32 indexNode, MyMessage request) dans \Form1.cs:ligne 375
     
      InnerException:
    Or quand je vais en mode debug, toute les variables sont correctement initialisées. J'ai essayé de remplacer int index par un Object quelconque (pour me prémunir de problème de cast), mais le problème est resté.
    D'autre part, il semble que quand je fait du pas à pas dans le debugger, aprè que VS m'ait rendu la main à cause de l'excepion non gérée, l'erreur ne se produit pas.
    L'erreur n'est pas tout à fait aléatoire et semble se produire quand il y a un peu de charge mais l'utilisation du InvokeRequired est bien censé résoudre ce problème non ?
    Quelqu'un aurait-il des idées sur le problème ? Ou bien une autre méthode pour ajouter des éléments dans une TreeView à partir de différents thread ?

    Merci de votre aide

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ton problème ne vient pas du tout du multithreading, c'est juste que tu as un index hors limite

    surement indexNode

    si tu lis une propriété indexée et que tu donnes en index 5 et qu'il y a que 4 élements, ca fait cette erreur ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Ta réponse n'explique pas le fait que quand je fais du pas à pas, l'erreur n'apparait plus.
    D'autre part, j'ai fait une modif un peu brute dans le code de la façon suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    MonLabel:
                    try
                    {
                        index = (int)(this.Invoke(d, new object[] { indexNode, request }));
     
                    }
                    catch (Exception)
                    {
                        Console.Write("Exception TreeView");
                        goto MonLabel;
                    }
    Et je n'ai plus le problème (et j'ai bien vérifié que je passais dans l'exception: 2 fois en tout sur les 135 appels donc l'utilisation du MonLable ne fait pas une boule infinie). Mais je trouve la solution un peu moche et je voudrais plutot utiliser quelque chose de propre.
    D'autre part, la valeur IndexNode (qui est >= 0, j'ai vérifié) qui est passé en paramètre n'est pas quelque chose que je calcule mais c'est toujours le résultat de l'appel de la fonction addMyMessageNode. Comme je ne fais pas de suppression dans le code, l'indexNode existe (théoriquement) toujours. Le code que j'exécute pour l'avoir est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    returnIndex = this.treeView1.Nodes[indexNode].Nodes.Add(request)
    J'ai trouvé une solution de contournement donc je devrais m'en contenter ... mais je déteste ne pas comprendre ce qui se passe .... donc si quelqu'un avait une idée ...

Discussions similaires

  1. annuler mise à jour table à partir formulaire
    Par Daniel MOREAU dans le forum VBA Access
    Réponses: 3
    Dernier message: 05/07/2007, 06h57
  2. Mise à jour table à partir sous-formulaire
    Par Daniel MOREAU dans le forum Access
    Réponses: 6
    Dernier message: 19/05/2006, 09h26
  3. Mise à jour a partir d'un autre formulaire
    Par xboulney dans le forum Access
    Réponses: 8
    Dernier message: 28/02/2006, 21h55
  4. Mise à jour Pro à partir de licence Etudiant ?
    Par Neilos dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/11/2005, 16h03
  5. [Sources]Mise à jour Treeview
    Par Sinclar dans le forum Contribuez
    Réponses: 33
    Dernier message: 09/05/2005, 18h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo