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 :

[WPF] Circular ProgressBar, problème synchronisation des threads


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut [WPF] Circular ProgressBar, problème synchronisation des threads
    Bonjour,

    J'utilise ce composant http://www.codersengine.com/forum/11...r-progress-bar afin de l'afficher quand un gros traitement est exécuté. Le problème c'est que lorsque je souhaite le lancer, l'animation se lance une fois le traitement terminé:
    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
     
            private void RunClick( object sender, EventArgs e )
            {
                splashProcess.Visibility = System.Windows.Visibility.Visible;
     
                List<AirportSimuException> errors = CheckSimulation( );
                foreach ( AirportSimuException error in errors )
                {
                    outputControl.AddException( error );
                }
     
                if ( errors.Count > 0 )
                {
                    navigationBar.Status = Navigation.StateMode.Stop;
                    return;
                }
     
                RouteCalculation( );
     
                splashProcess.Visibility = System.Windows.Visibility.Hidden;
            }
    Selon la visibilié, la storyboard du composant se lance ou s'arrete. Donc en voyant se problème, j'ai pensé à le lancer dans un autre thread, mais en faisant j'ai un message qui me dit que le composant est utilisé par un autre thread...

    Merci de votre aide

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Le Storyboard doit être lancé dans le thread de l'interface graphique, par contre c'est le traitement long qui doit être effectué dans un autre thread.

    Tu peux regarder du côté du BackgroundWorker pour ce genre de manip :

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut
    Arf, j'ai essayé ce truc là en tout premier, de même j'ai une erreur avec les threads...Bon je sens que je vais pas pouvoir ce joli ptit composant...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Babas007 Voir le message
    Arf, j'ai essayé ce truc là en tout premier, de même j'ai une erreur avec les threads...Bon je sens que je vais pas pouvoir ce joli ptit composant...
    Vu que tu l'as utilisé en premier. Alors mets nous le code et on te diras pourquoi ça n'a pas marché avec un BackgroundWorker . j'en suis sûr que t'as du mal utiliser les méthodes et évènements du BackgroundWorker.

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut
    Voilà le code où ça plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    RouteCalculation( )
    {
    ...
                        EllipseGeometry ellipse
                            = new EllipseGeometry( pkg.Start.Center, 15, 15 );
    ...
    }
    Précisément, ça vient de la propriété Center qui fait appel à une propriété Location que j'ai implémenté:
    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
     
            public Point Location
            {
                get
                {
                    Point pt = new Point( 0, 0 );
     
                    if ( Area != null
                         && Area is Visual
                         && Area.Children.Contains( this ) )
                    {
                        pt = Area.TransformToVisual( this ).Transform( pt );
                        pt = new Point( pt.X * -1, pt.Y * -1 );
                    }
     
                    return pt;
                }
            }
    C'est ici que j'ai le même problème de Thread...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je parle du code du gestionnaire de l'évènement DoWork de ton BackgroundWorker.

    Pour t'aider en attendant le bon code.

    Utilises-tu un dispatcher pour mettre à jour l'interface ? Parce que à ce que vois l'instruction ci-dessous modifie l'interface ce qui est interdit entre threads.
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    Area.TransformToVisual( this ).Transform( pt );

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut
    Oui c'est ce que je t'ai montré, le RouteCalculation:
    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
    private void RouteCalculation( )
            {
                ResizeMode = System.Windows.ResizeMode.NoResize;
                NameScope.SetNameScope( this, new NameScope( ) );
     
                int i = 0;
                double pixels = drawingArea.Ways[ 0 ].Zones[ 0 ].RenderSize.Height;
                List<Package> pkgs = UpdatePackages( cfgWindow.Packages );
     
                foreach ( Package pkg in pkgs )
                {
                    for ( int j = 0; j < pkg.Luggages.Count; ++j )
                    {
                        PointAnimationUsingKeyFrames keyFrames
                           = new PointAnimationUsingKeyFrames( );
     
                        EllipseGeometry ellipse
                            = new EllipseGeometry( pkg.Start.Center, 15, 15 );
     
                        RegisterName( "obj" + i, ellipse );
                        // ...Suite difficile à digérer   
            }
    Je n'utilise pas de dispatcher pour mettre à jour mon interface.

Discussions similaires

  1. Réponses: 13
    Dernier message: 11/06/2015, 15h51
  2. Problème avec des threads
    Par rajuto dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 11/02/2007, 20h41
  3. [Thread] Synchroniser des threads
    Par GLDavid dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 24/06/2006, 16h34
  4. Question sur la synchronisation des threads.
    Par sebastieng dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 07/12/2005, 15h55

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