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 :

Thread et fenetre de chargement


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 256
    Par défaut Thread et fenetre de chargement
    Bonjour,

    J'ai actuellement un user control qui contient un datagridview.
    Au moment du chargement de user control, une requete est lancé pour alimenter le datagridview, cette requête est assez longue puisqu'au niveau de l'affichage il y a un problème de rafraichissement.

    Donc je suis passer par un thread pour exécuter a part la fonction qui alimente le datagridview.

    Voici le code

    Au chargement du user control je lance le thread qui va alimenter mon datagridview :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void SuiviDevis_Load(object sender, EventArgs e)
            {
                if (!DesignMode)
                {
                    System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Process));
                    thread.Start();
                }
            }
    Voici la fonction process :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     public delegate void InitialisationHandler(); //Mon type de delegate
    public static InitialisationHandler initialisation; 
     
    public void Process() 
    {
       initialisation = new InitialisationHandler(RechargeListeSuivi);
       System.Threading.Thread.Sleep(500);
     
       IAsyncResult res = this.BeginInvoke(initialisation);
     
        this.EndInvoke(res);
    }
    Je ne met pas le code de la fonction RechargeListeSuivi car c'est une grosse requête sur le serveur SQL.

    En faisant tout sa, je n'ai plus de problème d'affichage, mon datagridview apparait et s'alimente dès que le thread a terminé de travailler.

    Sachant que c'est un peu long je voulais afficher un message dans le style "Veuillez patienter chargement en cours..." avec une progress bar qui avance.

    Mais je ne vois pas comment mettre le message et si il faut que je l'appel dans un autre thread.
    J'ai essayé en appelant une form mais celle-ci ne sa rafraichit pas...

    Pourriez vous m'aider ?

    Merci

  2. #2
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Moi je vois ca comme ca :

    Tu crée une Form, dans laquelle tu aura la barre de chargement, etc...
    Quand tu souhaites lancer ta requete, tu instancie cette Form, puis tu lances un Thread avec cette Form en parametre.

    Au fur et a mesure que le Thread avance, il met a jour l'UI (pas directement, regarde ca : http://faqcsharp.developpez.com/?pag...sc#form_thread ).

    Quand le thread se termine, il peut notifier une des deux Form en émettant un évenement, ou alors plus simplement appeler une fonction qui va fermer la Form d'attente, et afficher les resultats...

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 256
    Par défaut
    Merci pour ta réponse, je vais regarder sa ce matin et je vous tiens au courant.

    Cordialement

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 256
    Par défaut
    J'ai un petit soucis, je ne vois pas comment passer ma form en parametre dans le thread comme tu m'as dis.

    J'ai instancier ma form qui contiendra la barre de progression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Utils.Composants.AttenteReq aReq = new Utils.Composants.AttenteReq();
    Ensuite j'appel mon 1er thread qui effectue le lourd traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Process));
                    thread.Start();
    Puis j'appel un autre thread dans lequel je devrais passer ma form qui contient la barre de progression mais je ne vois pas comment ?

    Merci

  5. #5
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Salut,

    J'ai oublié que ça se faisait pas "tout seul"

    Regarde ici : http://faqcsharp.developpez.com/?pag...x_thread_param

    Mais ce que je voulais dire, c'est que c'est le Thread qui fait le lourd traitement qui s'occupe de mettre a jour l'UI (a priori, il n'y a que lui connais l'état d'avancement).

    Voila ce que je vois au niveau des classes :


    EDIT: Attention boulettes , j'ai changés des trucs ^^
    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
     
    class AttenteReq
    {
        /* les trucs que tu veux */
        public progressBar1 bar; //si tu la veux pas publique, il faut par des délégués
                                 //et cie, aux lieux de passer directement par Invoke.
    }
     
    class ThreadHandler
    {
        AttenteReq waitForm;
        /* Autres parametres dont tu a besoin pour ton traitement */
     
        //Constructor
        ThreadHandler(AttenteReq form)
        {
            this.waitForm = form;
        }
     
       /* ici tu met la fonction qui fait ton traitement, declarée public, ou du moins
        * pas private
        * par exemple :
        */
        public TypeResult faireTraitement()
        {
            //et la tu peux accéder à waitForm.progressBar1;
        }
    }
    Et ensuite, pour faire marcher tout ça, dans ta Form principale, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //inchangé
    Utils.Composants.AttenteReq aReq = new Utils.Composants.AttenteReq();
     
    ThreadHandler thh = new ThreadHandler(this); // le this représente la Form principale
     
    System.Threading.Thread thread = 
        new System.Threading.Thread(
            new System.Threading.ThreadStart(
                thh.faireTraitement));
        thread.Start();

  6. #6
    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
    Par défaut
    Salut,

    Lorsqu'il s'agit de notifier l'interface de l'avancement, on peut utiliser le BackgroundWorker. C'est plutôt pratique pour ce cas de figure

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 27/08/2009, 22h18
  2. Fenetre de chargement
    Par Kemanke dans le forum C++/CLI
    Réponses: 8
    Dernier message: 10/12/2008, 17h58
  3. [Swing][Thread] affichage fenetre pdt tache longue
    Par rems033 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 09/08/2007, 14h39
  4. Problème fenetre de chargement
    Par krolineeee dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 24/08/2006, 10h11
  5. [C#]Fenetre de chargement avant Application.run()
    Par 5:35pm dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/05/2006, 03h02

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