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 :

Subtring : StartIndex trop grand?!


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Femme Profil pro
    Apprentie
    Inscrit en
    Avril 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprentie

    Informations forums :
    Inscription : Avril 2016
    Messages : 18
    Points : 16
    Points
    16
    Par défaut Subtring : StartIndex trop grand?!
    Bonjour à tous!


    Je tente une communication, en port série, avec une carte : je n'envoie mes données que si la carte me donne la bonne réponse.

    Pour lire les données sur le port, j'utilise le thread suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Shared Sub Read()
        While True
            Try
                While (True)
                        duff = duff & CStr(SPort1.ReadExisting)
                End While
            Catch generatedExceptionName As TimeoutException
            End Try
        End While
    End Sub

    Et voilà le code qui pose problème :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    'Compteur des 12 CX
    For cmpt1 = 0 To 12
     
        'Compteur des secteurs
        For cmpt2 = 0 To 15
     
            'Erase sauf si on est dans la "zone interdite" (0x00C0F000 -> 0x00C0FFFF)
            If (cmpt1 = 0 And cmpt2 = 15) Then
            Else
     
                ValStr = "Hey"
     
                'Ecriture sur le port
                WriteRS232("9F", 1)
     
                'Attente de "0xAA" pour la suite / L'erreur est ici, au bout de la troisième boucle
                While (duff.Substring(CInt(duff.Length - 1), 1) <> AAStr)
                End While
     
                '00 00 E0
                WriteRS232("0000E0", 3)
                hbwait(30)
                'Adresse
                WriteRS232(ValStr, CInt(ValStr.Length / 2))
     
     
                'Attente de "0xEA" pour continuer
                While (duff.Substring(CInt(duff.Length - 1), 1) <> "ê")
                End While
     
                'Attente de "0xEA" pour continuer
                While (duff.Substring(CInt(duff.Length - 1), 1) <> "ê")
                End While
     
     
            End If
        Next
    Next

    Le code marche plutôt bien... les deux premières fois. J'ai ensuite un code erreur :

    "Une exception non gérée du type 'System.ArgumentOutOfRangeException' s'est produite dans mscorlib.dll
    Informations supplémentaires : startIndex ne peut pas être supérieur à la longueur de la chaîne.
    "

    Or, lorsque je mets un espion sur duff.length et duff.length-1, mon StartIndex est bien inférieur à la longueur de la chaîne!

    Alors qu'est-ce qui peut provoquer cette erreur?
    Une seconde question : est-il possible, et plus propre, de supprimer le contenu de duff avant chaque lecture?


    Je vous remercie d'avance de votre aide!

  2. #2
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par KelaireM Voir le message
    Et voilà le code qui pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'Compteur des 12 CX
                'Attente de "0xAA" pour la suite / L'erreur est ici, au bout de la troisième boucle
                While (duff.Substring(CInt(duff.Length - 1), 1) <> AAStr)
                End While
    Or, lorsque je mets un espion sur duff.length et duff.length-1, mon StartIndex est bien inférieur à la longueur de la chaîne!

    Quels sont les valeurs de duff.length et duff.length -1 lorsque ça plante?

  3. #3
    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
    il n'y a même pas se poser la question, c'est 0 et -1

    par contre ce code est tout moche, pas thread safe (potentiellement des bugs partout), et doit bouffer énormément de ressources pour rien (si readexisting retourne de suite même s'il n'y a rien)

    avant de faire des threads il faut comprendre ce que ca implique
    rien que sur duff.Substring(CInt(duff.Length - 1), 1)
    duff.length est évalué avant le duff.substring, et entre les 2 évaluations duff a pu être modifié par l'autre thread, donc c'est incohérent

    le timeoutexception n'a rien à faire là à priori, readexisting ne spécifie pas qu'il peut lever cette exception (source msdn)

    bref ... tout est à revoir
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre à l'essai
    Femme Profil pro
    Apprentie
    Inscrit en
    Avril 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprentie

    Informations forums :
    Inscription : Avril 2016
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Non, ce n'était pas 0 et -1 mais 31 et 30.

    J'ai résolue en ajoutant un temps d'attente de quelques ms. Pourquoi timeOutException? C'était une ArgumentOutOfRangeException.

    Peux-tu expliquer plus en détail pourquoi le thread n'est pas "safe"?
    Je code avec Option Explicit On et Option Strict On, aucune erreur détectée.

  5. #5
    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
    Catch generatedExceptionName As TimeoutException

    ce n'est pas ton thread qui n'est pas safe, c'est ton code entier qui n'est pas thread safe (voir avec google)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre à l'essai
    Femme Profil pro
    Apprentie
    Inscrit en
    Avril 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprentie

    Informations forums :
    Inscription : Avril 2016
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Mmh, je n'avais pas vu qu'il y avait deux while imbriqués aussi..
    Pour le TimeOutException : j'ai simplement repris l'exemple disponible sur la page SerialPort,Classe de msdn.

    Je suis débutante (d'où la banière "[DEBUTANT]" sur le sujet...), et ne sais pas utiliser les threads et ne sais encore moins les thread safe. En googelisant, j'ai trouvé deux site "en français" (ou plutôt traduit) et ta réponse a Gaetant13, mais je ne comprend toujours pas avec exactitude ce qu'est un code "thread-safe".
    J'ai donc supposé que tu parlais de "duff".
    Je ne modifie jamais une valeur d'un thread avec un autre, je ne fais que consulter..

Discussions similaires

  1. [CSS]Probleme de contenu trop grand et de pied de page
    Par Drannor dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 30/05/2005, 23h59
  2. Taille d'archive trop grande
    Par mick84m dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 12/05/2005, 16h39
  3. tableau trop grand ?
    Par Praxe dans le forum C++
    Réponses: 17
    Dernier message: 17/03/2005, 14h14
  4. modélisation d'une base : table trop grande
    Par Shabata dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 22/11/2004, 11h44
  5. Surface trop grande
    Par Black_Daimond dans le forum DirectX
    Réponses: 1
    Dernier message: 18/01/2003, 03h02

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