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

C# Discussion :

Gestion de threads [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut Gestion de threads
    Chers développeurs,

    J'ai actuellement un problème avec la gestion des thread, c'est pour cela que j'invoque votre aide

    Problème : Au démarrage de mon application je souhaite afficher une barre de progression (fenêtre chargement) et lorsque celle-ci est complète je souhaite ouvrir le menu (fenêtre menu). Pour ce faire je passe donc par la manipulation du thread principal et d'un thread actif. Voici mon code :
    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
    public partial classChargement : Form
    {
        ///<summary> Thread de chargement du programme </summary>
        private Thread thread_chargement;
    
        ///<summary> Pourcentage des traitements effectués </summary
        private int i_pourcent;
    
        private void Chargement_Load(object sender, EventArgs e)
        {
            /* J'instancie le thread et je lui assigne sa procédure de démarrage, ici Traitement_thread_chargement */
            thread_chargement = new Thread(Traitement_thread_chargement);
    
            /* On lance le thread, et si il y a une exception, on le coupe */
            try
            {
                thread_chargement.Start();
            }
            catch
            {
                thread_chargement.Abort();
            }
        }
    
        private void Traitement_thread_chargement()
        {
             /* Déclarations */
             int i_nb_etape = 11;
             int i_pct_etape = 100 / i_nb_etape;
             i_pourcent = 0;
             f_anomalie = false;
          
    //      .... Traitement simple 
          
            if (f_anomalie != true)
            {
                i_pourcent = i_pourcent + i_pct_etape; 
                Maj_barre_progression();
                Thread.Sleep(2000);
            }
    
    //      ... J'effectue d'autres traitements simple et je remets les mêmes conditions avec le if (Anomalie != true) à chaque fois pour modifier ma barre de progression.
        }
    
        ///<summary> Procédure de délégation du thread de chargement au thread principal qui va lancer Maj_barre_progression pour la mise à jour </summary>
        private delegate void Maj_barre_progression_delegate(); 
          
        private void Maj_barre_progression()
        {
        /* On vérifie si cette procédure est appelée par le thread de chargement qui lui nécessite de déléguer la mise à jour de la fenêtre au thread Principal car il n'a pas le droit */
            if (InvokeRequired == true)
            {
                /* Le thread de chargement délègue au thread principal la mise à jour de la fenêtre par Maj_barre_progression_delegate */
                Invoke(new Maj_barre_progression_delegate(delegate { Maj_barre_progression(); } ));     ERREUR EST ICI
                return;
            }
        }   
        //... Mise à jour de ma barre de progression.
    }
    Mon problème est qu'au moment de l'appel de la méthode delegate, une erreur de type "NullReferenceException" apparaît, je ne comprends pas pourquoi car j'ai essayer dans un autre petit programme de manipuler des thread de la même façon est tout c'est bien passé, d'où vient le problème?

    Pour info : J'utilise le compact framework 3.5

    Dans l'attente d'une réponse qui me sauvera, je vous remercie d'avance

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Bizarre. Et si tu vas en debug sur la ligne qui plante, et que te regarde dans le Watch ceci :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new Maj_barre_progression_delegate(Maj_barre_progression)
    Est-ce que c'est aussi à null?
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Si je mets un espion sur new Maj_barre_progression_delegate(delegate { Maj_barre_progression(); } ) j'obtiens dans "Valeur" le message suivant :
    L'expression ne peut contenir anonymous methods
    Je ne comprends pas le message, que veut-il dire?

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invoke(new Maj_barre_progression_delegate(delegate { Maj_barre_progression(); } ));
    qui ne correspond à rien d'utile, par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Invoke(new Maj_barre_progression_delegate(Maj_barre_progression));
    Accessoirement, il n'était pas utile de créer un delegate spécifique sur une méthode dont la signature est : car il en existe un par défaut tout fait, c'est ThreadStart.

    D'où simplification, virer la déclaration du delegate Maj_barre_progression_delegate qui est inutile et remplacer l'appel par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Invoke(new ThreadStart(Maj_barre_progression));

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Cette méthode ne fonctionne pas, elle me retourne le message d'erreur suivant :

    Erreur 1 La méthode surchargée correspondant le mieux à 'System.Windows.Forms.Control.Invoke(System.Delegate)' possède des arguments non valides \\spbur\Projets-VB-NET\CS_NDR_020\CS_NDR_020\Interfaces\fr_chargement.cs 810 17 CS_NDR_020

    Erreur 2 Argument '1'*: impossible de convertir de 'groupe de méthodes' en 'System.Delegate' \\spbur\Projets-VB-NET\CS_NDR_020\CS_NDR_020\Interfaces\fr_chargement.cs 810 24 CS_NDR_020
    Il faut que je lui passe une méthode delegate pour effectuer ma méthode "Maj_barre_progression"

    Où trouve-t-on la version du CLR utilisée?

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    J'ai supprimer la méthode delegate et dans l'appel à la place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invoke(new Maj_barre_progression_delegate(delegate { Maj_barre_progression(); } ));
    J'ai mis comme vous m'avez indiqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invoke(new ThreadStart(Maj_barre_progression));
    Et cela me mets toujours un message de NullReferenceException.

    Grrrrrrrr pas facile ces threads.

  7. #7
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut backgroundworker
    Bonjour,

    Je n'ai pas regardé tout les codes postées mais à priori je pense que l'utilisation d'un backgroundworker vous permettra de répondre plus simplement à votre problématique.

    http://msdn.microsoft.com/en-us/libr...undworker.aspx

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par spfo Voir le message
    Et cela me mets toujours un message de NullReferenceException.
    Là, c'est visiblement dans le corps de la méthode Maj_barre_progression qu'il y a un problème. Poster le code complet de la méthode.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Je rajoute le code complet de la méthode Maj_barre_progression :


    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
    public partial classChargement : Form
    {
        ///<summary> Thread de chargement du programme </summary>
        private Thread thread_chargement;
     
        ///<summary> Pourcentage des traitements effectués </summary
        private int i_pourcent;
     
        private void Chargement_Load(object sender, EventArgs e)
        {
            /* J'instancie le thread et je lui assigne sa procédure de démarrage, ici Traitement_thread_chargement */
            thread_chargement = new Thread(Traitement_thread_chargement);
     
            /* On lance le thread, et si il y a une exception, on le coupe */
            try
            {
                thread_chargement.Start();
            }
            catch
            {
                thread_chargement.Abort();
            }
        }
     
        private void Traitement_thread_chargement()
        {
             /* Déclarations */
             int i_nb_etape = 11;
             int i_pct_etape = 100 / i_nb_etape;
             i_pourcent = 0;
             f_anomalie = false;
     
    //      .... Traitement simple 
     
            if (f_anomalie != true)
            {
                i_pourcent = i_pourcent + i_pct_etape; 
                Maj_barre_progression();
                Thread.Sleep(2000);
            }
     
    //      ... J'effectue d'autres traitements simple et je remets les mêmes conditions avec le if (Anomalie != true) à chaque fois pour modifier ma barre de progression.
        }
     
        ///<summary> Procédure de délégation du thread de chargement au thread principal qui va lancer Maj_barre_progression pour la mise à jour </summary>
        private delegate void Maj_barre_progression_delegate(); 
     
        private void Maj_barre_progression()
        {
        /* On vérifie si cette procédure est appelée par le thread de chargement qui lui nécessite de déléguer la mise à jour de la fenêtre au thread Principal car il n'a pas le droit */
            if (InvokeRequired == true)
            {
                /* Le thread de chargement délègue au thread principal la mise à jour de la fenêtre par Maj_barre_progression_delegate */
                Invoke(new Maj_barre_progression_delegate(delegate { Maj_barre_progression(); } ));     ERREUR EST ICI
                return;
            }
     
        /* Barre de Progression */
        barre_chargement.Value = i;
        /* On raffraichit la fenêtre */
        this.Refresh();
        }   
     
    }

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Accessoirement, il n'était pas utile de créer un delegate spécifique sur une méthode dont la signature est : car il en existe un par défaut tout fait, c'est ThreadStart.
    Ce n'est pas celui que j'utiliserais (même si ça fonctionnerait sans problème) car il a un sens particulier, et ça risque d'introduire de la confusion dans le code, vu qu'ici il ne s'agit pas de démarrer un thread. J'utiliserais plutôt Action, ou mieux : MethodInvoker, qui est vraiment fait pour ça

  11. #11
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ce n'est pas celui que j'utiliserais (même si ça fonctionnerait sans problème) car il a un sens particulier, et ça risque d'introduire de la confusion dans le code, vu qu'ici il ne s'agit pas de démarrer un thread. J'utiliserais plutôt Action, ou mieux : MethodInvoker, qui est vraiment fait pour ça
    Oui, tu as raison, mais l'(les ?) autres, je ne m'en souviens jamais; c'est pour cela.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  12. #12
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par spfo Voir le message
    Je rajoute le code complet de la méthode Maj_barre_progression :
    Bizarre.

    A quel moment est appelé ta métode Chargement_Load, qui est sans doute un event handler, mais cablé sur quel évenement ?

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  13. #13
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    au départ de l'application je lance ma fenêtre Menu_Load dans laquelle j'appelle la fenêtre Chargement_Load (où tous les traitements concernant la barre de progression sont appelés), est-ce que ma référence nulle peut venir de là?

  14. #14
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Menu_Load et Chargement_Load n'étant pas des fenêtre mais des méthodes, on va avoir du mal à avancer.

    Apparemment, la fenêtre s'appelle classChargement.

    Sur quoi est cablé l'event handler Chargement_Load ? (si il s'agit bien d'en event handler).

    Merci de poser le contructeur de classChargement.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  15. #15
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Je me corrige :

    Au départ de l'application je lance ma fenêtre Menu et dans Menu_Load j'appelle la méthode Chargement_Load (où tous les traitements concernant la barre de progression sont appelés)

  16. #16
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Voici le code utile de ma fenêtre Chargement :

    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
    namespace monAppli
    {
        public partial class Chargement : Form
     
      private void Chargement_Load(object sender, EventArgs e)
    {
      /*  J'effectue des ajustements de fenêtres */
     
      /* J'appelle ma méthode qui va créer et lancer le thread de chargement */
                lancement_thread_chargement();
    }
     
    private void lancement_thread_chargement()
    {
               /* J'instancie le thread et je lui assigne sa procédure de démarrage, ici Traitement_thread_chargement */
            thread_chargement = new Thread(Traitement_thread_chargement);
     
            /* On lance le thread, et si il y a une exception, on le coupe */
            try
            {
                thread_chargement.Start();
            }
            catch
            {
                thread_chargement.Abort();
            }
        }
     
     private void Traitement_thread_chargement()
        {
             /* Déclarations */
             int i_nb_etape = 11;
             int i_pct_etape = 100 / i_nb_etape;
             i_pourcent = 0;
             f_anomalie = false;
     
    //      .... Traitement simple 
     
            if (f_anomalie != true)
            {
                i_pourcent = i_pourcent + i_pct_etape; 
                Maj_barre_progression();
                Thread.Sleep(2000);
            }
     
    //      ... J'effectue d'autres traitements simple et je remets les mêmes conditions avec le if (Anomalie != true) à chaque fois pour modifier ma barre de progression.
        }
     
        ///<summary> Procédure de délégation du thread de chargement au thread principal qui va lancer Maj_barre_progression pour la mise à jour </summary>
        private delegate void Maj_barre_progression_delegate(); 
     
        private void Maj_barre_progression()
        {
        /* On vérifie si cette procédure est appelée par le thread de chargement qui lui nécessite de déléguer la mise à jour de la fenêtre au thread Principal car il n'a pas le droit */
            if (InvokeRequired == true)
            {
                /* Le thread de chargement délègue au thread principal la mise à jour de la fenêtre par Maj_barre_progression_delegate */
                Invoke(new Maj_barre_progression_delegate(delegate { Maj_barre_progression(); } ));     ERREUR EST ICI
                return;
            }
     
        /* Barre de Progression */
        barre_chargement.Value = i;
        /* On raffraichit la fenêtre */
        this.Refresh();
        }

    Je ne commprends pas pour j'ai un message de NullReferenceException ...

  17. #17
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    J'ai trouvé ma solution après de nombreuses recherche sur le net, il en fallait pas passer par un delegate et il suffisait juste d'invoker un nouveau thread pour effectuer la méthode qui modifie le design. Merci de votre aide tout de même

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

Discussions similaires

  1. gestion des threads
    Par yanis97 dans le forum Langage
    Réponses: 6
    Dernier message: 20/04/2006, 12h41
  2. Gestion des Threads
    Par Nalfouille dans le forum MFC
    Réponses: 3
    Dernier message: 05/04/2006, 16h29
  3. Gestion des threads
    Par yanis97 dans le forum C++
    Réponses: 6
    Dernier message: 08/03/2006, 09h39
  4. GEstion des thread
    Par Julien Dufour dans le forum Access
    Réponses: 8
    Dernier message: 06/10/2004, 14h28
  5. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 28/11/2002, 09h40

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