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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    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 : 50
    Localisation : Belgique

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    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?

  3. #3
    Membre averti
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    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 : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    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));

+ 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