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 :

WPF - Actualisation écran (Multithread)


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2017
    Messages : 71
    Par défaut WPF - Actualisation écran (Multithread)
    Bonjour

    J'ai mon application WPF qui travaille avec un second Thread. Ce thread va dans SQL chercher des données dans une table, me les stock dans une datatable, ensuite je remplis une ObservableCollection avec ma classe dans une boucle puis à la fin de la boucle je donne la source au Binding pour l'affichage dans le XAML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Current.Dispatcher.Invoke(new Action(() => this.DataContext = lstOperations));
    Sauf qu'au début de la fonction avant de récupérer mes données SQL je suis obligé de nettoyer cette liste pour pas que ça concatène 2 fois les données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Current.Dispatcher.Invoke(new Action(() => lstOperations.Clear()));
    Mon problème est le suivant : l'écran se vide, travaille, puis recharge les données

    Quelle serait la façon de faire qui permettrait de ne pas voir l'écran se vider et que le tout soit remplacé une fois le traitement terminé ?

    Par avance, merci.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    ton chargement doit se faire dans autre chose que lstoperations
    une fois ce chargement terminé, tu fais invoke lstoperations.clear + lstoperations = listetemporaire + set datacontext
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2017
    Messages : 71
    Par défaut
    Salut
    C'est bien ce à quoi j'avais pensé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Application.Current.Dispatcher.Invoke(new Action(() => lstOperationsTemp.Clear())); // Je vide ma liste temp
     
    for(int i = 0; i < dvOp.Count; i++)
    {
            Application.Current.Dispatcher.Invoke(new Action(() => lstOperationsTemp.Add(clOp))); // J'ajoute mes enregistrements dans ma liste Temp
    }
     
                Application.Current.Dispatcher.Invoke(new Action(() => lstOperations.Clear()));  // Je vide la liste d'affichage
                lstOperations = lstOperationsTemp; // Je remplis la liste d'affichage avec la Temp précédemment rempli
                Application.Current.Dispatcher.Invoke(new Action(() => this.DataContext = lstOperations)); // Je set le DataContext avec ma liste d'affichage
    Le problème avec cette méthode, on dirait qu'il se souvient du lstOperations = lstOperationsTemp, quand je clear la lstOperationsTemp (première ligne de mon code) on dirait qu'i l me vide aussi ma liste d'affichage. Conclusion à la fin de ma fonction : mon écran est tout vide. Je vois la liste appraître, puis disparaite.

    Merci

  4. #4
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lstOperations = lstOperationsTemp;
    Quand tu fais ça la liste référencée par lstOperations est celle référencée par lstOperationsTemp, ce n'est pas une copie ; donc si à un moment tu vides lstOperationsTemp ça vide aussi lstOperations. Pour éviter cela, soit tu crées une nouvelle liste à affecter à lstOperations (et dans ce cas ce n'est même pas la peine de la vider) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lstOperations = new List(lstOperationsTemp);
    soit tu ajoutes le contenu de la liste temporaire à la liste permanente, après l'avoir vidée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lstOperations.Clear();
    lstOperations.AddRange(lstOperationsTemp);
    La méthode List.AddRange() permet d'ajouter directement dans la liste tous les items d'un conteneur, sans avoir à faire de boucle, ce qui peut s'avérer plus performant.

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2017
    Messages : 71
    Par défaut
    Salut

    Merci pour ta réponse

    2 problèmes : avec ta solution 1 alors je créé ma liste dans ma fonction et du coup je ne peux plus l'appeler dans l'autre fonction

    Avec la solution 2, ma liste étant une ObservableCollection, AddRange n'est pas une propriété possible. Comment l'ajouter ?

    EDIT : J'ai réussi, je parcours la liste Temp qui elle est gloable dans ma 2ème fonction. Merci

  6. #6
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2017
    Messages : 71
    Par défaut
    Bonjour

    J'ai un peu changé ma méthode de faire :

    J'ai cette déclaration en globale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private ObservableCollection<CL_Operation> _lstOperationsTemp = new ObservableCollection<CL_Operation>();
            public ObservableCollection<CL_Operation> LstOperationsTemp
            {
                get { return _lstOperationsTemp; }
                set
                {
                    _lstOperationsTemp = value;
                }
            }
    Et ceci en démarrage de l'application :

    Du coup, j'ai à nouveau le même problème, l'écran se vide, travaille, puis recharge les données

    Cela doit venir du fait que désormais c'est this en DataContext.

    La solution alternative que j'ai trouvé c'est de ne pas définir le DataContext = this au chargement de la fenêtre

    Je le mets à "Null" au début de ma fonction et je le réassigne à "this" à la fin de la fonction. Résultat : l'écran est noir et ré-affiche directement toute la liste d'un seul coup. Plus il y a de données plus l'écran est noir longtemps bien sûr

    Comment pourrais-je procéder pour éviter cet écran noir ?

    Merci

    Avez-vous une idée ?

    Merci.

Discussions similaires

  1. WPF (résolution écran)
    Par JFJ54 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 07/04/2014, 15h14
  2. WPF et écran tactile
    Par Lenn0x dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 24/07/2012, 10h22
  3. WPF MEF et écran de login
    Par CaptainChoc dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 17/01/2012, 11h19
  4. [WPF][MultiThreading/Composants] Petit probleme de conception ?
    Par chico200987 dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 15/08/2010, 19h02
  5. Multithread en WPF
    Par Herwin78800 dans le forum Windows Presentation Foundation
    Réponses: 13
    Dernier message: 01/09/2009, 19h56

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