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 :

Visual Studio 2005 - debug thread


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut Visual Studio 2005 - debug thread
    Bonjour à tous,

    J'ai conçu un programme qui contient un thread devant mettre à jour l'interface en fonction de son travail. Bref, c'est bizarre parcequ'à chaque fois que je débug (pas à pas), Visual Studio 2005 (SP1) *freeze* pour 10 secondes, ensuite il me permet de jumper à la ligne suivante et ensuite mon thread meurt sans savoir pourquoi.

    Alors je me suis dit, pourquoi pas repartir un projet vide et y exécuter le même code au plus simple possible afin de vérifier si ce problème existe. Et c'est le cas !

    Visual Studio freeze entre l'exécution ces deux lignes (// *******).

    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
     
    public partial class Form1 : Form
    {
        private Thread m_Thread = null;
     
        public Form1()
        {
            InitializeComponent();
        }
     
        private void Form1_Load(object sender, EventArgs e)
        {
     
        }
     
        private static void UpdateFirmware(object param)
        {
            Form f = (Form1)param; // *******
     
            // Simple test pour le pas à pas
            int k = 0;      // *******
            k = k + 2;
        }
     
        private void button1_Click(object sender, EventArgs e)
        {
            m_Thread = new Thread(new ParameterizedThreadStart(UpdateFirmware));
            m_Thread.IsBackground = true;
            m_Thread.Start(this); // *******
        }
    }
    Toutefois, j'ai remarqué que le problème n'existe pas si je ne passe pas *this* en paramètre au Thread.

    Comme par exemple, ce bout de code fonctionne très bien en debug :

    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
    private static void UpdateFirmware(object param)
    {
        int k = (int)param;
     
        // Simple test pour le pas à pas
        int k = 0;
        k = k + 2;
    }
     
    private void button1_Click(object sender, EventArgs e)
    {
        m_Thread = new Thread(new ParameterizedThreadStart(UpdateFirmware));
        m_Thread.IsBackground = true;
        m_Thread.Start(4);
    }
    Est-ce que j'ai louppé quelque chose ? Je ne comprend pas trop. Je dois bien passé *this* en paramètre si je veux mettre à jour mon interface (avec un BeginInvoke évidemment). J'ai pas trop envie de passer une structure avec tous les contrôles à mettre à jour, ça sera long pour rien. À moins que je n'aie pas le choix.

    Merci

  2. #2
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Je viens d'essayer avec une structure pour y passer un simple TextBox et le problème est le même.

    J'ai quand même trouvé ce qui cause le problème et comment le solutionner de façon temporaire pour mon projet.

    Voir les adresses suivantes :
    http://social.msdn.microsoft.com/For...a-f892635f7833

    http://blogs.msdn.com/greggm/archive...18/494648.aspx

    Ce qui est le plus étrange, c'est que je ne dois pas être le premier programmeur .NET à créer un thread, lui passer la référence d'une fenêtre en paramètre et ensuite mettre à jour ses controles durant le processus du thread ???

    Vous n'avez jamais rencontré ce problème au paravant ? Peut-être que je m'y prend mal... J'attend vos commentaires

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    il est possible que ton thread connaisse le form sans le passer en paramètre

    il suffit de faire une classe, instanciée par le thread principal et qui prend en paramètre le form, le range dans une variable privée
    puis appeler une sub de cette classe qui instancie un thread, qui accède à la variable privée
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par Erakis Voir le message
    Ce qui est le plus étrange, c'est que je ne dois pas être le premier programmeur .NET à créer un thread, lui passer la référence d'une fenêtre en paramètre et ensuite mettre à jour ses controles durant le processus du thread ???
    Tu n'es pas le premier à essayer, non

    Mais en winforms, seul le thread associé à la form a le droit de modifier son contenu. C'est pour ça que le composant BackGroundWorker a été créé : il s'occupe de créer un thread exécutant ton code business, et balance des events dans le thread de la form, auxquels tu peux abonner des méthodes qui pourront sans souci tripatouiller ta form.
    Je t'invite à te documenter à son sujet sur la MSDN ou ici-même, où le sujet a été de maintes fois abordé.

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    je pense qu'il peut s'en sortir sans backgroundworker, meme si en effet il encapsule tout ce qui est nécessaire à du multithreading ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Il peut s'en sortir, oui, mais c'est par pour autant qu'il pourra mettre à jour son UI à partir de ce nouveau thread

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    oui mais il précise qu'il sait qu'il faut invoker (ou begininvoker) pour modifier l'ui
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/03/2012, 14h27
  2. [Visual Studio 2005 Debug]Problème de debug
    Par Astraya dans le forum Visual Studio
    Réponses: 1
    Dernier message: 12/02/2009, 10h53
  3. Debug avec Emulator CE 5.0 (x86) et Visual Studio 2005
    Par atone81 dans le forum Windev Mobile
    Réponses: 0
    Dernier message: 09/02/2009, 09h59
  4. Réponses: 2
    Dernier message: 10/11/2008, 09h05
  5. Remote Debugging avec Visual Studio 2005
    Par bibifoc dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/03/2008, 16h11

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