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 :

Utilisation d'un thread avec WPF


Sujet :

C#

  1. #1
    Membre régulier

    Homme Profil pro
    Étudiant Réseaux et Télécoms
    Inscrit en
    Octobre 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant Réseaux et Télécoms
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 121
    Points : 92
    Points
    92
    Par défaut Utilisation d'un thread avec WPF
    Bonsoir à tous,

    Description : Je souhaite afficher une progressBar pendant le chargement de ma fenêtre. J'utilise le tutorial suivant : http://elegantcode.com/2011/10/07/ex...busyindicator/

    Problème : Ma fenêtre n'évolue pas, les nouveaux éléments ne sont pas ajoutés/

    Donc, je ne comprend pas car j'utilise bien le dispatcher pour changer ma UI.

    Je vous mets mon code ci-dessous.

    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
    72
    73
    74
    75
     /// <summary>
            /// Réaction à la construction de la fenêtre
            /// </summary>
            /// <param name="sender">Fenêtre construite</param>
            /// <param name="e">Evènement</param>
            private void Window_Loaded(object sender, RoutedEventArgs r)
            {
                BackgroundWorker worker = new BackgroundWorker();
                worker.DoWork += (o, ea) =>
                {
                    Createur_Partie createur = new Createur_Partie();
                    createur.construirePartie(_joueurs, _grande);
                    _partie = createur._monteur._partie;
                    affichageMap();
                };
                worker.RunWorkerCompleted += (o, ea) =>
                {
                    busyIndicator.IsBusy = false;
                    //On met à jour les informations sur les joueurs dans la partie de droite de la fenêtre
                    //updateInfoJoueurs();
                    //On ajoute un observateur à notre partie
                    // _partie.PropertyChanged += new PropertyChangedEventHandler(changement_partie);
                     //_partie.debut();
                };
                worker.RunWorkerAsync();
            }
     
            private void affichageMap()
            {
                Carte map = _partie._carte;
     
                for (int c = 0; c < map._largeur; c++)
                {
                    Dispatcher.Invoke((Action)(() => mapGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(50, GridUnitType.Pixel) })));
                }
                Console.WriteLine(10);
                for (int l = 0; l < map._hauteur; l++)
                {
                    Dispatcher.Invoke((Action)(() => mapGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(50, GridUnitType.Pixel) })));
                    for (int c = 0; c < map._largeur; c++)
                    {
                        Rectangle r = null;
                        //On crée un rectangle pour case représentant les ressources
                        r = createCase(c, l, map.getCase(c, l));
                        Dispatcher.Invoke((Action)(() => mapGrid.Children.Add(r)));
     
                        //On crée une ellipse donnant une information rapide sur le nombre de troupes situé sur la case
                        Dispatcher.Invoke((Action)(() => mapGrid.Children.Add(createEllipseUnite(c, l, r))));
                        foreach (Unite u in map.getCase(c, l).Unites)
                        {
                            Dispatcher.Invoke((Action)(() => mapGrid.Children.Add(affichageUnite(u, u.getType()))));
                        }
                    }
                }
     
            }
     
    private Rectangle createCase(int c, int l, Case ca)
            {
                var rectangle = new Rectangle();
                rectangle.Fill = selectionCaseImage(ca);
                rectangle.StrokeThickness = 3;
                rectangle.Tag = ca; 
     
                //Le rectangle est un observateur de la case
                ca.PropertyChanged += new PropertyChangedEventHandler(changement_case);
     
                //Placement du rectangle à la bonne position
                Grid.SetColumn(rectangle, c);
                Grid.SetRow(rectangle, l);
     
                //Ajout d'un listener de clique gauche
                rectangle.MouseLeftButtonDown += new MouseButtonEventHandler(clique_sur_une_case);
                return rectangle;
            }
    Merci d'avance !!!!!!!!!!!!!!!!!!!!!!!

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Points : 68
    Points
    68
    Par défaut
    Il se peut que cela passe rapidement , vous pouvez mettre
    leur de déclanchement de l'événement RunWorkerCompleted de thread et avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BusyIndicateur.Isbusy=false;
    .
    Vous avez la réponse à votre question ? Mettez votre sujet en

    Une personne vous a correctement aidé ? Cliquez sur le +1

  3. #3
    Membre régulier

    Homme Profil pro
    Étudiant Réseaux et Télécoms
    Inscrit en
    Octobre 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant Réseaux et Télécoms
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 121
    Points : 92
    Points
    92
    Par défaut
    Bonsoir,

    Hélas, cela ne change rien.

  4. #4
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Bonjour,

    Il faut que tu mettes un WorkerReportsProgess à true et ensuite que tu 'abonnes à l'évènement ProgressChanged et enfin que dans le doWork, tu appelles la fonction ReportProgres...

    Bon dév.
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  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 : 37
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Petit point sur l'interet d'un BackgroundWorker : comme son nom l'indique, il permet de lancer, en tache de fond, une fonction couteuse et permet ainsi d'éviter le gel de l'interface utilisateur.
    Dans le code que tu postes, il semblerait que ce qui est fait ne soit que des opérations non couteuses et qui de plus implique la GUI (via Dispatcher.Invoke). Il y a, a mon avis, aucun interêt à utiliser un BackgroundWorker (voire même, c'est plus contreproductif qu'autre chose).

  6. #6
    Membre régulier

    Homme Profil pro
    Étudiant Réseaux et Télécoms
    Inscrit en
    Octobre 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant Réseaux et Télécoms
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 121
    Points : 92
    Points
    92
    Par défaut
    Bonsoir à tous,

    Citation Envoyé par sisqo60 Voir le message
    Bonjour,

    Il faut que tu mettes un WorkerReportsProgess à true et ensuite que tu 'abonnes à l'évènement ProgressChanged et enfin que dans le doWork, tu appelles la fonction ReportProgres...

    Bon dév.
    Le problème dans mon cas, n'est pas la progression de la progessBar.

    Citation Envoyé par Nathanael Marchand Voir le message
    Petit point sur l'interet d'un BackgroundWorker : comme son nom l'indique, il permet de lancer, en tache de fond, une fonction couteuse et permet ainsi d'éviter le gel de l'interface utilisateur.
    Dans le code que tu postes, il semblerait que ce qui est fait ne soit que des opérations non couteuses et qui de plus implique la GUI (via Dispatcher.Invoke). Il y a, a mon avis, aucun interêt à utiliser un BackgroundWorker (voire même, c'est plus contreproductif qu'autre chose).
    Oui, mais en faite mes méthodes sont coûteuses, j'ai un algorthime de création de la carte de plus de 1000 cases qui s'éxécutent lors de la création de la partie puis au niveau de l'affichage il y a donc environ 2500 objets à créer. Afin que l'écran ne se freeze pas, je me suis dit que c'était la meilleure solution.

    Voyez-vous des erreurs dans le code?

    Merci

  7. #7
    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 : 37
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par TWEESTY Voir le message
    Oui, mais en faite mes méthodes sont coûteuses, j'ai un algorthime de création de la carte de plus de 1000 cases qui s'éxécutent lors de la création de la partie puis au niveau de l'affichage il y a donc environ 2500 objets à créer. Afin que l'écran ne se freeze pas, je me suis dit que c'était la meilleure solution.

    Voyez-vous des erreurs dans le code?

    Merci
    Sauf que ton écran va freezer quand même car toutes tes taches lourdes sont des tâches d'interface et il n'y a qu'un seul et unique thread qui peut acéder à l'interface, ce qui revient au même que sans le background worker.

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Tu as un souci avec ton Dispatcher Peut-être

    Essaye comme ça:
    System.Windows.Application.Current.Dispatcher.Invoke(.......)
    ou
    App.Current.Dispatcher.Invoke(.....)

Discussions similaires

  1. utilisation des threads avec gtk en C sous linux
    Par zerimbak dans le forum GTK+ avec C & C++
    Réponses: 10
    Dernier message: 25/04/2011, 20h23
  2. Utiliser Windows CardSpace avec WPF
    Par vivoli12 dans le forum Windows Communication Foundation
    Réponses: 0
    Dernier message: 03/08/2010, 17h51
  3. comment on utilise les thread avec pygtk ?
    Par dkmatt dans le forum GTK+ avec Python
    Réponses: 8
    Dernier message: 03/11/2009, 16h42
  4. Utilisation des threads avec C++
    Par lolita4882 dans le forum C++
    Réponses: 4
    Dernier message: 10/11/2007, 12h25
  5. probleme d'utilisation d api c dans des controle forms avec wpf
    Par ZashOne dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 24/07/2007, 13h04

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