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 Presentation Foundation Discussion :

[C#] BackgroundWorker + changement GUI


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 15
    Par défaut [C#] BackgroundWorker + changement GUI
    Bonjour à vous,

    J'effectue dans mon application un traitement assez lourd qui freeze la GUI pendant quelque instant donc j'utilise un backgroundWorker avec un splashscreen et une barre de chargement.

    Le problème, dans la méthode qui éffectue le traitement "backgroundWorker_DoWork" quand je modifie la GUI j'ai une exception de type :

    Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire.
    La grosse partie lourde de mon traitement est en faite la génération d'objet graphique, cela doit bien ce touver dans la méthode DoWork de mon backgroundWorker.

    Comment faire pour modifier la GUI à partir de ce thread ?

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par Carl2010 Voir le message
    Bonjour à vous,

    J'effectue dans mon application un traitement assez lourd qui freeze la GUI pendant quelque instant donc j'utilise un backgroundWorker avec un splashscreen et une barre de chargement.

    Le problème, dans la méthode qui éffectue le traitement "backgroundWorker_DoWork" quand je modifie la GUI j'ai une exception de type :

    "Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire."

    La grosse partie lourde de mon traitement est en faite la génération d'objet graphique, cela doit bien ce touver dans la méthode DoWork de mon backgroundWorker.

    Comment faire pour modifier la GUI à partir de ce thread ?

    Merci d'avance.
    Dans un DoWork d'un backgroundworker, tu n'es pas censé acceder à des ressources graphiques. Cependant, si tu désires le faire, tu peux utiliser la méthode Invoke de tous les objets héritant de Control:
    http://msdn.microsoft.com/en-us/libr...ol.invoke.aspx

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut
    Plop voici un petit exemple d'utilisation du BaclgroundWorker que j'avais fait pour quelqu'un, si ca peut t'aider ...

    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
    67
    68
    69
    70
    71
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
     
    namespace BackgroundWorker_Exemple
    {
        public partial class Form1 : Form
        {
     
            private delegate String GetTextDelegateHandler();
            private GetTextDelegateHandler GetTextDelegate;
     
            private delegate void SetTextDelegateHandler(String texte);
            private SetTextDelegateHandler SetTextDelegate;
     
     
            public Form1()
            {
                InitializeComponent();
                GetTextDelegate = new GetTextDelegateHandler(GetText);
                SetTextDelegate = new SetTextDelegateHandler(SetText);
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
     
            }
     
            private void SetLabel()
            {
                string sTexte = textBox1.Text;
                char[] tableauLettres = sTexte.ToCharArray();
     
                foreach (char l in tableauLettres)
                {
                    String texte = (String)label1.Invoke(GetTextDelegate);
                    texte += l.ToString();
                    label1.Invoke(SetTextDelegate, texte);
                    Thread.Sleep(1000);
                }
            }
            private String GetText()
            {
                return label1.Text;
            }
            private void SetText(String texte)
            {
                label1.Text = texte;
            }
     
            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                SetLabel();
     
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                backgroundWorker1.RunWorkerAsync();
     
            }
     
     
        }
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 15
    Par défaut
    Merci à vous.

    Je précise que je travail en WPF donc j'ai regarder du côté de Dispatcher.Invoke.

    Mais si je dois créer pour chaque objet graphique un Delegate ca devient trop contraignant je vais devoir abandonner mon idée...

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par Carl2010 Voir le message
    Merci à vous.

    Je précise que je travail en WPF donc j'ai regarder du côté de Dispatcher.Invoke.

    Mais si je dois créer pour chaque objet graphique un Delegate ca devient trop contraignant je vais devoir abandonner mon idée...
    Tu peux te servir de Lambda expressions

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 196
    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 196
    Par défaut
    il ne faut pas créer un délégué par control, mais un délégué par méthode qui contient du code d'ihm, tu peux modifier plusieurs controles dans cette méthode

    néanmoins le background est une encapsulation de plusieurs choses nécessaires en multithreading, dont le report d'info sur le thread principal
    en effet, le backgroundworker possède 2 évènements qui sont déclenchés sur le thread principal, reportprogress et l'event de fin
    pour le reportprogress, il y a une méthode sur l'objet qui fait que l'évènement va être appelé
    dans l'event tu peux donc manipuler tout ce que tu veux sur l'interface
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Changement de l'icone d'une appli sous kdevelop
    Par vedder dans le forum Linux
    Réponses: 3
    Dernier message: 06/02/2003, 14h16
  2. Changement de langue dynamique (D6 et outils de traduction)
    Par agon dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/09/2002, 16h15
  3. URGENT : Zoom et changement de repère
    Par poca10 dans le forum MFC
    Réponses: 5
    Dernier message: 28/05/2002, 13h32

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