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 :

Multithread pour remplir un stackpanel


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Par défaut Multithread pour remplir un stackpanel
    Bonjour à tous,

    Je remplie un stackPanel avec des UserControls. Ces userControl sont paramétrés à partir du résultats d'une requête LINQ.
    La somme des données est assez lourde et le remplissage est assez long, du coup l'affichage reste bloqué le temps du remplissage.

    J'aimerais que le stackpanel se remplisse au fur et à mesure et que l'affichage se mette à jour.

    Je pense que la solution est de mettre un dispatcher, qui passe un coup l'affichage un coup le remplissage, mais je ne sais pas du tout comment faire ca en C#.

    Merci d'avance pour l'aide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Est-ce qu'un UpdateLayout() sur ton stackpanel après chaque ajout fonctionnerait?

  3. #3
    Membre expérimenté Avatar de el_pedro
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 200
    Par défaut
    Tu parle en WPF là ???

    Tu ne peux pas utiliser des delegate comme en Win Form ???

  4. #4
    Membre éclairé Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Par défaut
    Oui je n'ai pas précisé, mais ma partie affichage est en WPF.
    J'ai lu des choses sur les delegate, mais je n'ai pas tt compris.
    Comment dois je structuré mon code pour faire ca?

  5. #5
    Membre expérimenté Avatar de el_pedro
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 200
    Par défaut
    Pour utiliser un delegate il te faut :

    - une methode (avec ou sans paramètre) qui se chargera de construire ton composant graphique (tu peux faire une méthode prenant un paramètre le résultat de ta requète Linq et créant ensuite tes composants graphiques puis les insérant dans ton stackpanel).
    - un type de delegate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public delegate void LeNomDeTonType(List<tesObjets> maList);
    Tu précise ici les paramètres que tu va faire transiter entre ta partie graphique et ton thread (List<tesObjets> maList dans l'exemple).

    - un delegate typé avec le type que tu viens de créer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public LeNomDeTonType leNomDeTonDelegate;
    - un composant (form, panel, usercontrol....) pour exécuter ton delegate.

    Pour ma part, je crée toujours mes thread dans des classes static, je baserai mon exemple là dessus, à toi d'adapter. Ici, je charge une datagridview en WinForm à partir d'une list.

    Class de thread
    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
    public static class Scanning
        {
     
            private static Thread thread;//Mon Thread
     
            public delegate void ReloadHandler(); //Mon type de delegate
            public static ReloadHandler reload; //Mon delegate
     
            public static Control linkedControl; //Control executant de mon delegate
     
            public static void Start() //Pour démarrer mon thread
            {
                thread = new Thread(new ThreadStart(Process));
                thread.Start();
            }
     
            private static void Process() //Le méthode de traitement du thread, c'est ici que tu peux charger ta requête linq et c'est ici qu'on déclenche le delegate
            {
                while (true) //J'ai une boucle, je pense que tu n'en a pas besoin si ça n'est pas un traitemant continu.
                {
                    Thread.Sleep(1000);
     
                    if (linkedControl != null) //Si le control executant de mon delegate à bien été renseigné
                    {
                        Scanning.LoadLignes(); //C'est une procédure perso pour charger ma collection d'objet
                        Scanning.linkedControl.Invoke(reload); // déclenchement du delegate
                    }
                }
            }
        }
    Extrait de ma Form
    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
     
     
    //Le constructeur
     
     
            public FRM_Princ()
            {
                InitializeComponent();
                Scanning.linkedControl = this; //Je désigne ma form comme executeur de mon delegate
                Scanning.reload = new Scanning.ReloadHandler(LoadProduit); //J'abonne la procedure qui se trouve juste en dessous au delegate du thread. Cela fonctionne un peux comme un evenement.
            }
     
            //La procedure dans ma form qui modifie mon controleur datagridview
            public void LoadProduit()
            {
                DGV.Rows.Clear();
                var list = (from l in Bon.bon.lignes where l.Value != "0" orderby l.Key.nom select l).ToList();  //Je récupère les données à insérer (tu peux mettre cette liste en paramètre virer cette ligne
                foreach (var l in list)
                {
                    DGV.Rows.Add(new object[] { l.Key, l.Key.nom, l.Value.ToString() + " " + l.Key.unite });
                }
            }
    je n'ai plus qu'à faire un petit Scanning.Start(); et ça roule nickel, l'affichage de ma grille est totalement indépendant du reste de ma form, pas de latence ni de blocage de la form.

    En gros, le fonctionnement des delegate est assez similaire à ceux des évènements.

    J'espère avoir assez détaillé mon explication, n'hésite pas à me dire si ça ne marche pas ou si tu ne pige pas quelque chose.

  6. #6
    Membre éclairé Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Par défaut

    Merci pour ces explications tres claires et tres precise.
    J'ai bien compris le principe, je rencontre juste un probleme, c'est que le retour de ma requete est de typa var et n'a donc pas de typage. Est ce que ca peut marcher quand meme?

  7. #7
    Membre éclairé Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private static void Process() //Le méthode de traitement du thread, c'est ici que tu peux charger ta requête linq et c'est ici qu'on déclenche le delegate
            {
                while (true) //J'ai une boucle, je pense que tu n'en a pas besoin si ça n'est pas un traitemant continu.
                {
                    Thread.Sleep(1000);
     
                    if (linkedControl != null) //Si le control executant de mon delegate à bien été renseigné
                    {
                        Scanning.LoadLignes(); //C'est une procédure perso pour charger ma collection d'objet
                        Scanning.linkedControl.Invoke(reload); // déclenchement du delegate
                    }
                }
    Je ne comprend pas bien cette partie, corrige moi si je me trompe:
    • t'as ton thread sleep et ta boucle spécifique à ton projet.
    • LinkedControl, ici ca sera mon stackPanel?
    • Scanning est ta classe d'affichage?
    • Tu appel la méthode LoadLigne
    • Enfin je ne comprend pas ce que fait Scanning.linkedControl.Invoke(reload). Ou est le lien avec la methode Ligneload?

  8. #8
    Membre éclairé Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Par défaut
    Non malheureusement, l'affichage reste bloqué jusqu'à la fin du chargement.

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

Discussions similaires

  1. Procédure pour remplir table et sa table dérivée
    Par C_C dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/12/2005, 20h41
  2. [C#]Erreur pour remplir mon dataset
    Par liliprog dans le forum Windows Forms
    Réponses: 16
    Dernier message: 15/07/2005, 19h03
  3. [VB.Net] Probleme pour remplir un DropDownList
    Par angelevil dans le forum ASP.NET
    Réponses: 2
    Dernier message: 02/03/2005, 17h59
  4. Réponses: 6
    Dernier message: 24/01/2005, 14h12
  5. Réponses: 36
    Dernier message: 13/05/2004, 18h22

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