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 :

Thead et VS Debugger


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Mars 2003
    Messages : 7
    Par défaut Thead et VS Debugger
    Bonjour à tous,

    Je rencontre une anomalie que je n'arrive pas à résoudre.

    J'ai écrit un Windows Form simple en C# avec 2 boutons (Démarrer et Arrêter) permettant le démarrage et l'arrêt d'un Thread (Cf.code).
    En mode "Exécution" et en mode "Debug" sans point d'arrêt, tout se passe nickel !
    Par contre, en mode Debug avec un point d'arrêt positionné sur le "Sleep" (Cf. code), le debugger se bloque qq secondes et plante le thread sans autre forme de procès...

    Je vous fais grâce du source de Program.cs (standard).
    Merci à tout ceux qui peuvent m'aider à qualifier mon anomalie.

    PS : Merci à Pascal Belaud pour sa Saga pour le source VB (transformé en C# par mes soins) intitulé "Threading", chapitre 6...
    http://www.microsoft.com/france/vision/saga-dot-net/

    Voici le
    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
     
    namespace DemoThreadCSharp
    {
        public partial class Form1 : Form
        {
            private Thread m_Thd;
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button_Demarrer_Click(object sender, EventArgs e)
            {
                m_Thd = new Thread(Demarrer);
                m_Thd.Start();
     
                MessageBox.Show("Thead démarré...", "Information", MessageBoxButtons.OK);
            }
            private void Demarrer()
            {
                for (int i = 0; i < 100000; i++)
                {
                    MajLabel(i.ToString());
                    Thread.Sleep(500);
                }
            }
            private delegate void MajLabelDlg(String pTxt);
            private void MajLabel(String pTxt)
            {
                if (label1.InvokeRequired)
                {
                    label1.Invoke(new MajLabelDlg(MajLabel), pTxt);
                    return;
                }
                label1.Text = pTxt;
            }
     
            private void button_Arreter_Click(object sender, EventArgs e)
            {
                m_Thd.Abort();
            }
        }
    }
    Le Form.Designer.cs...
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    namespace DemoThreadCSharp
    {
        partial class Form1
        {
            /// <summary>
            /// Variable nécessaire au concepteur.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
     
            /// <summary>
            /// Nettoyage des ressources utilisées.
            /// </summary>
            /// <param name="disposing">true si les ressources managées doivent être supprimées*; sinon, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
     
            #region Code généré par le Concepteur Windows Form
     
            /// <summary>
            /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
            /// le contenu de cette méthode avec l'éditeur de code.
            /// </summary>
            private void InitializeComponent()
            {
                this.button_Demarrer = new System.Windows.Forms.Button();
                this.button_Arreter = new System.Windows.Forms.Button();
                this.label1 = new System.Windows.Forms.Label();
                this.SuspendLayout();
                // 
                // button_Demarrer
                // 
                this.button_Demarrer.Location = new System.Drawing.Point(38, 41);
                this.button_Demarrer.Name = "button_Demarrer";
                this.button_Demarrer.Size = new System.Drawing.Size(75, 23);
                this.button_Demarrer.TabIndex = 0;
                this.button_Demarrer.Text = "Demarrer";
                this.button_Demarrer.UseVisualStyleBackColor = true;
                this.button_Demarrer.Click += new System.EventHandler(this.button_Demarrer_Click);
                // 
                // button_Arreter
                // 
                this.button_Arreter.Location = new System.Drawing.Point(174, 41);
                this.button_Arreter.Name = "button_Arreter";
                this.button_Arreter.Size = new System.Drawing.Size(75, 23);
                this.button_Arreter.TabIndex = 1;
                this.button_Arreter.Text = "Arreter";
                this.button_Arreter.UseVisualStyleBackColor = true;
                this.button_Arreter.Click += new System.EventHandler(this.button_Arreter_Click);
                // 
                // label1
                // 
                this.label1.AutoSize = true;
                this.label1.Location = new System.Drawing.Point(32, 95);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(0, 13);
                this.label1.TabIndex = 2;
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(292, 273);
                this.Controls.Add(this.label1);
                this.Controls.Add(this.button_Arreter);
                this.Controls.Add(this.button_Demarrer);
                this.Name = "Form1";
                this.Text = "Form1";
                this.ResumeLayout(false);
                this.PerformLayout();
     
            }
     
            #endregion
     
            private System.Windows.Forms.Button button_Demarrer;
            private System.Windows.Forms.Button button_Arreter;
            private System.Windows.Forms.Label label1;
        }
    }

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Bonsoir Bartman,

    deja quelle version de VS as-tu ? Pour ma part, je me souviens avoir eu des problemes dans le genre avec la version 2005 (mais jamais trop compris pourquoi), maintenant sous 2008, dans la meme situation, cela n'arrive plus.

    Pour revenir a ton code, quel est plus precisement le probleme ? Le thread s'abort et tu recuperes un thread aborted ? ou autres ? Pour ma part, cela marche tres bien (enfin j'ai placé un point sur sleep, et meme placé deux point (un dans le premier thread, et l'autre sur sleep pour forcer le switch)).

  3. #3
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Mars 2003
    Messages : 7
    Par défaut Thread et VS Debugger.
    Citation Envoyé par SirJulio Voir le message
    Bonsoir Bartman,

    deja quelle version de VS as-tu ? Pour ma part, je me souviens avoir eu des problemes dans le genre avec la version 2005 (mais jamais trop compris pourquoi), maintenant sous 2008, dans la meme situation, cela n'arrive plus.

    Pour revenir a ton code, quel est plus precisement le probleme ? Le thread s'abort et tu recuperes un thread aborted ? ou autres ? Pour ma part, cela marche tres bien (enfin j'ai placé un point sur sleep, et meme placé deux point (un dans le premier thread, et l'autre sur sleep pour forcer le switch)).
    Bonjour et merci pour la réponse...

    La version que j'utilise est la version 2007 (version 8.0.50727.867 - vsvista.050727-8600) dans un environnement Vista Edition intégrale.

    Quant à l'anomalie, soyons effectivement plus précis :
    Le thread ne disparait pas (j'ai vérifié, l'identifiant est toujours valorisé), mais le thread (censé incrémenter de 1 en 1 toutes les 500 millisecondes le Label) ne "tourne" pas - la valeur du label reste inchangé à "0".
    Le phénomène est assez étrange car en l'occurence, le debugger semble se bloquer l'espace de 2 à 3 secondes, puis il rend la main, positionné sur le point d'arrêt du Sleep(500)... Mais le simple fait de "continuer" l'exécution ne provoque rien - le traitement ne renvoie en l'occurence aucun message d'anomalie, mais n'incrémente pas le compteur comme attendu.

    Encore merci à toute aide.
    Alain as Bartman.

  4. #4
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Mars 2003
    Messages : 7
    Par défaut Thread et VS Debugger.
    Bonjour,

    J'ai trouvé l'origine du problème. En tout cas, ma dernière manipulation a solutionné l'anomalie :

    J'ai "extrait" et recopié l'ensemble de ce qui concernait la gestion du Thread dans un source spécifique "myThread.cs", en gérant l'appel de la fonction déléguée (c'est pas très propre, mais pour mon test, c'est suffisant).

    Il semble que le fait que le code du thread soit dans le meme source que le code de l'interface (Formulaire) provoque l'anomalie indiqué dans le debugger.

    Maintenant, il me reste à mieux gérer la gestion de ma fonction déléguée dans le code du thread. Si vous avez des soluces à me soumettre, n'hésitez pas.

    Encore merci.
    Alain as Bartman.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    content que ce soit resolu. Comme dit plus haut, il m'etait deja arrivé ce genre de probleme (enfin probleme, pas vraiment c'est juste emmerdant) ou tout VS freezait sur le breakpoint, et rendait la main au bout de quelques secondes, mais comme dit aussi, jamais vraiment trouvé de solution. AMHA, capourrait venir d'un switch de thread vers un en pause (waitsleepjoin).

    Pour l'amelioration, la seule que je verrai etant d'eviter de reinstancier le meme delegué 100000 fois, meme si ici, tu n'es clairement pas dans une portion de code critique, c'est toujours ca de pris (et ca que le GC aura en moins à balayer (objet à durée de vie ultra courte = pas copain du GC)). [C'est vraiment pas grand chose, mais bon]

    Bon courage. =)

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

Discussions similaires

  1. [TP]debugger
    Par mmm dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 07/12/2003, 22h07
  2. [BPW]Exécution du debugger Windows sur un OS 32 bits
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 28/11/2003, 22h55
  3. [VB6] Comment Debugger une activeX ??
    Par Berns dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/05/2003, 17h34
  4. Debugger sous Linux
    Par Shadow Blade dans le forum Choisir un environnement de développement
    Réponses: 6
    Dernier message: 29/11/2002, 18h54
  5. Debugger 16-32 bits
    Par Mat dans le forum Assembleur
    Réponses: 4
    Dernier message: 28/06/2002, 11h34

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