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] Form ProgressBar qui ne bloque pas le traitement


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut [Thread] Form ProgressBar qui ne bloque pas le traitement
    Bonjour,

    je suis en .NET 2.0 C#

    J'aimerai faire une petite classe générique qui permet de faire un truc somme toute classique: afficher les étapes d'un traitement en cours avec une barre de progression (progressbar)

    Comment m'y prendre pour que ca ne bloque pas le traitement qui tourne derrière ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                using (StepForm f = new StepForm ())
                {
                    f.Show();
                 }
    je sais que Show permet de faire en sorte que ce soit non modal... mais après je ne sais pas comment réaliser le reste.
    Que me conseillez vous ? Quelle est la bonne pratique ?
    D'utiliser Invoke, un backgroundWorker ?

    Merci du coup de main & Bonne journée à tous

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 85
    Par défaut
    Utiliser les Threads est une bonne idée. Vous avez un exemple dans les tuto :
    http://drq.developpez.com/dotnet/articles/threads/#L5

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    rori
    Et bien c'était pile poil ce que je recherche !
    (j'ai du mal chercher)

    Je te remercie et je te souhaite de passer une agréable journée !

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    Hum par contre je souhaite mettre un bouton annuler dans ma Form ou il y a la progression, seulement celui si est "bloqué" pour le moment pendant la progression...

    Donc j'ai 2 form:
    Une principal qui appel la form de progression ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                using (StepForm f = new StepForm ())
                {
                    f.Show();
                    int progression = 1;
                    while (f.GoToStep(progression) && progression < 100)
                    {
                        System.Threading.Thread.Sleep(50);
                        ++progression;
                    }
                    f.Close();
                }

    dans ma form de progression il y a:
    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
        public partial class StepForm : Form
        {
     
            private delegate void ProgressBarDelegateHandler(int step);
            private ProgressBarDelegateHandler ProgressBarDelegate;
     
            public StepForm()
            {
                InitializeComponent();
     
                ProgressBarDelegate = new ProgressBarDelegateHandler(UpdateProgressBar);
            }
     
            private void UpdateProgressBar(int step)
            {
                progressBar1.Value = step;
            }
     
            public bool GoToStep(int progression)
            {
                this.Invoke(this.ProgressBarDelegate, new object[] { progression });
                this.Update();
                return true;
            }
        }

    EDIT/
    BeginInvoke ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    Arf j'ai essayé avec la methode BeginInvoke... mais le bouton est toujours bloqué....

    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 delegate void InvokeMethod(int step);
     
            public StepForm()
            {
                InitializeComponent();
     
            }
     
            private void UpdateProgressBar(int step)
            {
                progressBar1.Value = step;
            }
     
            public bool GoToStep(int progression)
            {
     
                IAsyncResult res = progressBar1.BeginInvoke(new InvokeMethod(UpdateProgressBar), new object[] { progression });
                progressBar1.EndInvoke(res);
                this.Update();
                return true;
            }

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 85
    Par défaut
    C'est normal, vous n'utilisez pas les Threads !

    Dans votre exemple, tout se fait sur le Thread de votre Main.

    Regarder bien dans le tutorial que je vous ai link :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Thread t = new Thread(new ThreadStart(ThreadProcess));
    t.Start();
     
    private void ThreadProcess() {
    	for(int i = 0 ; i < 11 ; i++) 
    	{
    	   // Déclenche la mise à jour de l'interface
    	   this.Invoke(this.ProgressBarDelegate,new object[] {i});
    	   Thread.Sleep(1000);
    	 }
    }
    Ici c'est bien un nouveau thread (t) qui gére la mise à jour de la ProgressBar.

Discussions similaires

  1. Temporisation qui ne bloque pas l'application
    Par Zorgloub dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/02/2008, 16h55
  2. Réponses: 4
    Dernier message: 04/01/2008, 11h44
  3. alert() qui ne bloque pas le chargement de la page ?
    Par Cofondinde dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/08/2007, 10h31
  4. recvfrom qui ne bloque pas ?
    Par innosang dans le forum Réseau
    Réponses: 1
    Dernier message: 21/06/2007, 11h11
  5. Réponses: 8
    Dernier message: 25/11/2005, 18h38

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