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 :

BeginInvoke et Event : mise à jour de control [Débutant]


Sujet :

C#

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut BeginInvoke et Event : mise à jour de control
    Bonjour,

    Voici le contexte : j'ai un événement qui est levé par une classe dans une librairie dont je n'ai pas le code, je m'abonne à cet événement dans un projet client (Winform) qui embarque la librairie, ma méthode dans mon projet client est bien levée.
    Je souhaite me servir de cette méthode pour mettre à jour un control (ici une listbox), le problème c'est qu'en passant par la méthode BeginInvoke de ma listbox, je mets bien le message en queue, mais l'information ne s'affiche pas au fil de l'eau de la levée d'événement, mais uniquement lorsque le thread instancié par l'objet de la librairie rend la main.

    J'utilise ce code dans ma méthode abonnée à l'événement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            private void ClientOnUpdate(object sender, EventParameters UpdateEventArgs)
            {
                //Affichage instantané!
                Console.WriteLine("Update Event Parameters: {0}", UpdateEventArgs);
     
                //Affichage différé à la fin du thread du traitement par la librairie
                lbErrors.BeginInvoke((Action)delegate()
                {
                    lbErrors.Items.Add(String.Format("Update Event Parameters: {0}", UpdateEventArgs));
                });
     
            }
    La console réagit bien à chaque levée d'événement, mais ma listbox (lbErrors) attend la fin du traitement de la classe de la librairie pour m'afficher tous les éléments.

    Comment faire pour avoir les messages dans ma listbox dès qu'un événement est levé ?

    Merci

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    es tu au moins sur un autre thread ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Bonjour,

    En fait pour mon test : derrière un bouton du form, j'instancie l'objet de la librairie, je lance sa méthode principale qui d'après la doc lance des threads et lève des événements pour indiquer la progression du traitement. L'objet ne revoie de valeur que lorsque l'événement indiquant le statut 'End' est levé.

    Derrière mon bouton qui lance ce traitement je ne suis pas dans un thread.
    Ma méthode abonnée affiche le statut renvoyé dans l'événement à la fois dans la console, et dans un listbox (via un BeginInvoke)

    Voici schématiquement l'output de la console (tel qu'attendu)
    Start
    Step 1 OK
    Step 2 OK
    Step 3 OK
    End

    Le contenu du listbox est identique MAIS l'affichage ne se met à jour que lorsque l'objet de la librairie renvoie une valeur, c'est à dire sur levée de l'événement indiquant le statut 'End'. Justement j'aimerai pouvoir utiliser un control pour afficher l'état d'avancement du processus.

    Si tu as des idées je suis preneur ...

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Ok ça fonctionne lorsque je lance la méthode dans un thread, je bloquais le thread UI, erreur de débutant...

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

Discussions similaires

  1. Mise à jour de control differents avec boutons
    Par Décibel dans le forum IHM
    Réponses: 11
    Dernier message: 27/05/2010, 15h08
  2. Mise a jour des control avant affichage
    Par kacedda dans le forum MFC
    Réponses: 3
    Dernier message: 28/03/2007, 14h56
  3. problème de mise a jour des controls
    Par samalive dans le forum MFC
    Réponses: 8
    Dernier message: 25/03/2007, 03h16
  4. Formulaire, mise à jour controle
    Par lawokgluot dans le forum Access
    Réponses: 4
    Dernier message: 03/07/2006, 18h01
  5. Mise à jour d'une controle via une classe.
    Par Andry dans le forum Delphi
    Réponses: 4
    Dernier message: 23/06/2006, 16h00

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