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 :

Fenêtre - CallBack - Multithreading


Sujet :

C#

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Fenêtre - CallBack - Multithreading
    Bonjour,

    J'utilise un BackgroundWorker dans une fenêtre et je cherche comment exécuter une fonction dans le thread principal quand je suis dans le thread secondaire, je n'ai pas trouvé la façon de lui transmettre un delegate (adresse de procédure pour appel en call back). J'utilise les méthodes Invoke pour mettre à jour les labels de la fenêtre.

    L_Connected.Invoke(new MethodInvoker(delegate { L_Connected.Visible = true;

    Si vous avez une piste.
    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 704
    Points : 5 323
    Points
    5 323
    Par défaut
    Le BW est justement fait pour t'éviter les Invoke.
    Tu est sensé travailler sur le thread principal dans la méthode branchée sur le délégué ProgressChanged du BW.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bw = new BackgroundWorker();
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        label1.Text = e.ProgressPercentage.ToString() + "% complete";
    }

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Oups
    Citation Envoyé par popo Voir le message
    Le BW est justement fait pour t'éviter les Invoke.
    Tu est sensé travailler sur le thread principal dans la méthode branchée sur le délégué ProgressChanged du BW.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bw = new BackgroundWorker();
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        label1.Text = e.ProgressPercentage.ToString() + "% complete";
    }

    Ma Question est sans doute mal formulé !

    Je lance une connexion à un processus distant qui me réponds.
    J'ai une IHM qui me permet de connecter ou déconnecter le processus lancé.
    Je lance un BW pour écouter des requêtes Keep-alive d'autre processus via une BD avec des actions à réaliser sur le 1er processus.
    Je dois pouvoir intervenir sur mon processus principale par un call back

    Cordialement

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 704
    Points : 5 323
    Points
    5 323
    Par défaut
    Il est inutile de citer entièrement le dernier message pour répondre.
    Cela va de soit et cela tient de la place pour rien.

    Le call back dont vous avez besoin pour intervenir sur le thread principale est celui branché sur le délégué ProgressChanged.
    Ce call back est déclenché par l'appel à ReportProgress dans la méthode branché sur le délégué DoWork du BW.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = (BackgroundWorker)sender;
     
        while (condition)
        {
            var info = new Something { .... };
            worker.ReportProgress(i, info);
     
            // Do something eating up CPU time
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        va info = (Something)e.UserState;
        label1.Text = e.ProgressPercentage.ToString() + "% complete";
    }

  5. #5
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    OK, Merci

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

Discussions similaires

  1. Callbacks et Multithreading
    Par Dmnbp7ip dans le forum C++
    Réponses: 2
    Dernier message: 05/10/2007, 16h29
  2. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42
  3. [MFC] Un callback dans des MFC ...
    Par elsargento dans le forum MFC
    Réponses: 3
    Dernier message: 18/02/2004, 16h04
  4. [Win32]App multithread
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 25/09/2003, 09h57
  5. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/10/2002, 23h36

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