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 :

déboguer "pas à pas" un Thread secondaire


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 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 216
    Par défaut déboguer "pas à pas" un Thread secondaire
    Bonjour à tous,

    Comme je me demande s'il y a un bug dans un de mes thread secondaires, j'aimerais passer le débogger "pas à pas détaillé' dans la fonction qui est appelée de la méthode DoWork du composant BackgroundWorker. (je précise que j'ai développé une classe spécifique qui hérite du BackgroundWorker.)
    Seulement, malgré que je sois sûre que la fonction s'exécute (dans certains cas, elle renvoie une valeur correcte), je n'arrive pas à vérifier les détails de son exécution. Dans le débogger, j'arrive à voir ce qui se passe jusqu'au "RunWorkerAsync". Mais pas plus bas, et ceci malgré tous les points d'arrêts que je peux insérer dans le theard secondaire.

    Comment fait-on pour déboguer "pas à pas" un Theard secondaire?
    Merci beaucoup de bien vouloir me dépanner!
    Bonnes fêtes à tous, chacune et chacun!


    P.S: j'utilise Visual Studio 2013 Express

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    il suffit de mettre un point d’arrêt dans la méthode qui est sur le thread
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 216
    Par défaut
    C'est bien ce que je me dit. Mais, ce qui m'étonne, c'est que les points d'arrêts qui sont dans le theard secondaire ne semblent pas pris en compte. Or, le débogger passe bien par la ligne du RunWorkerAsync. Mais, il passe directement à la ligne du dessous qui est un End Sub.

    Je me permets de mettre mon code ci-dessous pour rendre ma question plus concrète.

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
        ''' <summary>
        ''' Exécute le DoWord selon la table demandée
        ''' </summary>
     
        Friend Sub RunDoWork()
            AddHandler MyBase.RunWorkerCompleted, AddressOf LoadListThread_RunWorkerCompleted
            Select Case cTable
                Case Is = "Auteurs"
                    AddHandler MyBase.DoWork, AddressOf GetListAuteurs_DoWork
                Case Is = "Mots-clefs"
                    AddHandler MyBase.DoWork, AddressOf GetListMotsClefs_DoWork
                Case Is = "Lieux"
                    AddHandler MyBase.DoWork, AddressOf GetListLieux_DoWork
                Case Is = "Editeurs"
                    AddHandler MyBase.DoWork, AddressOf GetListEditeus_DoWork
                Case Is = "Collections"
                    AddHandler MyBase.DoWork, AddressOf GetListCollections_DoWork
                Case Is = "TypesDeDocuments"
                    AddHandler MyBase.DoWork, AddressOf GetListTypesDocuments_DoWork
                Case Is = "Bibliographies"
                    If nInventaire = -1 Then
                        AddHandler MyBase.DoWork, AddressOf GetListBibliographies_DoWork
                    Else
                        AddHandler MyBase.DoWork, AddressOf GetListBibliographiesByInventaire_DoWork
                    End If
            End Select
            Me.RunWorkerAsync()
        End Sub
     
        ''' <summary>
        ''' Tâche d'arrière plan: Obtient la liste des bibliographies pour un numéro d'inventaire
        ''' </summary>
     
        Private Sub GetListBibliographiesByInventaire_DoWork(ByVal sender As System.Object, ByVal e As DoWorkEventArgs)
            e.Result = LoadDataTableBibliographies(nInventaire)
        End Sub
     
        ''' <summary>
        ''' Obtient la liste des bibliographies pour un numéro d'inventaire
        ''' </summary>
        ''' <param name="nInventaire">n° d'inventaire</param>
     
        Private Function LoadDataTableBibliographies(ByVal nInventaire As Integer) As DataTable
            Dim oAccesBibliographies As New ClassAccesAuxDonnees.TableBibliographie
            Dim oAccesLvrBibliographies As New ClassAccesAuxDonnees.TableLvrBibliographie
            Dim oCollNumBiblio As Collection = oAccesLvrBibliographies.ListNumBibliographie(nInventaire)
            Dim oCreateDataTable As New TempDataTable
            Dim dtLstBibliographies As DataTable = oCreateDataTable.CreateDataTableListe("Biblio")
     
            If oCollNumBiblio IsNot Nothing Then
                For Each numBiblio As Integer In oCollNumBiblio
                    Dim cBiblio As String = oAccesBibliographies.GetBibliographie(numBiblio)
                    Dim oRow As DataRow = dtLstBibliographies.NewRow
                    oRow("Numero") = numBiblio
                    oRow("Biblio") = cBiblio
                    dtLstBibliographies.Rows.Add(oRow)
                Next
                Return dtLstBibliographies
            Else
                Dim oRow As DataRow = dtLstBibliographies.NewRow
                oRow("Numero") = -1
                oRow("Biblio") = "Pas de bibliographies attribuées"
                dtLstBibliographies.Rows.Add(oRow)
                Return dtLstBibliographies
            End If
        End Function

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    le pas à pas se passe dans un thread, il est possible d'avoir plusieurs pas à pas en même temps si plusieurs threads

    quand on démarre un thread, le pas à pas ne saute pas dans le thread directement mais passe juste à la ligne d'après
    néanmoins s'il y a un point d'arrêt dans la méthode vs s'arrêtera bien dessus, le démarrage d'un thread est assez rapide.

    un point d'arrêt non utilisable c'est quand le point le symbolisant n'est pas remplit
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    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
    C'est effectivement étrange, ls breakpoints devraient toujours être obéis, il n'y a rien à faire en principe. Es-tu sûr que ces lignes sont exécutées ? As-tu essayé de le vérifier en plaçant une instruction Debug.WriteLine pour afficher un message dans la fenêtre de sortie ("output") ? Ne seraient-ils pas désactivés (en blanc plutôt que rouge) ou n'auraient-ils pas une condition associée (clic droit sur le break point > condition) ?

    Dans Visual Studio il y a aussi une fenêtre permettant de passer d'un thread à l'autre. Menu Debug > Windows > Threads (ou quelque chose dans ce genre). Ça permet de voir l'état de chaque thread et leurs piles d'appels respectives.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 216
    Par défaut
    Merci de vos conseil. J'ai effectivement pu résoudre mon bug en passant d'un thread à l'autre par les menus de Visual Studio.

    A propos, et par simple curiosité, pourquoi, dans la liste des thread qu'affiche Visual Studio, certains ont un nom comme "thread principal" par exemple, et que d'autres sont identifier par un simple numéro ? Est-il de nommer les threads créés par programmation ?

    Joyeuses fêtes à tous!

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

Discussions similaires

  1. [RegEx] Pas de quote, sauf si échappée
    Par xxkirastarothxx dans le forum Langage
    Réponses: 0
    Dernier message: 20/05/2014, 15h41

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