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

VB.NET Discussion :

Thread etrange "ArgumentOutOfRangeException"


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut Thread etrange "ArgumentOutOfRangeException"
    Bonjour,

    Je lance un thread qui fait appel à une procedure "drawgraph" pour dessiner une courbe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Public StopThread2 As Boolean
        Public thread2 As Threading.Thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                        If thread2 Is Nothing Then
                            thread2 = New Threading.Thread(AddressOf DrawGraphthread)
                            thread2.Start()
                            thread2.Priority = Threading.ThreadPriority.Normal
                        End If

    Hors dans ce thread si je test une variable "Start.fichier.Mestest(Start.fichier.Mestest.Count - 1).tab_pression.Count" j'ai un ArgumentOutOfRangeException hors l'index "Start.fichier.Mestest.Count - 1" existe bien !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Public Sub DrawGraphthread()
            Do Until StopThread2 = True
                If Start.fichier.Mestest(Start.fichier.Mestest.Count - 1).tab_pression.Count > 0 Then
                    DrawGraph()
                End If
            Loop
        End Sub
    Est ce que le fait d'être dans une tâche limite la lecture de variable ??? Je suis perdu est vraiment bloqué

    voici l'erreur :
    L'exception System.ArgumentOutOfRangeException n'a pas été gérée
    Message=" Parameter name: index"
    StackTrace:
    in System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource) in System.ThrowHelper.ThrowArgumentOutOfRangeException() in System.Collections.Generic.List`1.get_Item(Int32 index) in SewerTest.AirTest.DrawGraphthread()
    InnerException:
    Pour être le plus clair possible, Tab_pression est dans une structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public tab_pression As New List(Of Double)

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Bonjour,

    tu devrais poser un point d'arrêt sur ton if et y aller en pas à pas

    Tu pourras ainsi vérifier plusieurs choses :

    - Est-ce que l'erreur se produit dès le premier tour de boucle ?
    - Que vaut Start.fichier.Mestest(Start.fichier.Mestest.Count - 1) ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut
    J'ai placé un point rouge sur la ligne, j'ai démarré le mode debug. ça break bien à la position spécifié mais je ne sais pas où afficher le contenu des variables

    estce que le fait de dessiner depuis un tableau dans un thread alors qu'en paraléle on ajoute des valeurs dans se tableau puisse etre la source de mes ennuies ?

  4. #4
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    A vue de nez je dirais que la liste est vide. Donc count = 0 et l'index passé en argument est -1.

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Tu selectionnes ta donnée, tu fais clic droit, et tu fais ajouter un espion pour que l'espion s'ajoute en bas, ou espion expresse... pour voir directement la valeur.
    Effectivement si tu parcours et ajoutes des valeurs en même temps dans un tableau, ça va poser problème

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 251
    Par défaut
    Merci pour vos conseils, c'est effectivement la lecture et l'ecriture en simultané sur un meme tableau qui posait probleme !

    Mon soucis etait que mon application devait etre assez fiable sur le tps pendant un enregistrement de donné et qu'a cause du tracage d'une courbe j'avais un décalage de 15s sur 4mn ! (je suis sous CE avec un ARM ... pas un PC classique).

    J'ai optimisé le traçage de mon graphique et je l'ai inclus directement dans la boucle d'attente avant chaque etape :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                endwait = Environment.TickCount + ms_to_wait
                While (Environment.TickCount < endwait)
                    If Etape = 4 Then
                        If Start.fichier.Mestest(Start.fichier.Mestest.Count - 1).tab_pression.Count > 0 Then
                            DrawGraph()
                        End If
                    End If
                    System.Threading.Thread.Sleep(1)
                    Application.DoEvents()
                End While

+ Répondre à la discussion
Cette discussion est résolue.

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