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 :

Crée un thread pour lancer une form avec progressbar


Sujet :

C#

  1. #1
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut Crée un thread pour lancer une form avec progressbar
    Bonjour,

    Je suis en pleine expérimentation en ce moment, pour faire des test unitaire et de faisabilité, qui vont me servir pour mon projet pour le BTS.

    Je viens de vérifier qu'une arraylist pouvait accepter suffisamment de ligne données en générale je dépasserais pas 1 donnée à la seconde pendant 24h.

    Pour ce faire, j'ai crée un petit programme qui enregistre en fichier TXT plusieurs ligne (100 000 ligne) . Puis je le charge ensuite dans mon arayliste et je l'affiche dans une listebox.

    Cela marche impeccable mais comme je l'avais imaginé (vu la taille) le logiciel est bloqué le temps du traitement.

    Donc je veux faire, dans ce même test, un autre test de faisabilité en créant un thread. Mais je veut que celui-çi affiche une autre Form avec un progressbar.
    Car le projet que je réalise pour mon BTS sera mis en situation par la suite dans mon entreprise (je suis en reconversion) et je connait parfaitement mes collègues qui n'attendront pas 3 secondes que cela s'affiche.
    En affichant cette progressbar au moins ils ne relanceront pas une nouvelle fois le programme.

    j'ai suivi l'un des tuto sur ce site pour crée mon thread et lui passé des paramètres, j'ai réussi et on peut dire que sa marche, car en debug je vois bien l'évolution de la value du progressbar.

    Mais voila, j'arrive pas a initialisé correctement la Form en elle même, soit elle s'affiche mais je suis bloquer. Soit je fait bien mon traitement mais rien ne s'affiche.

    Pouriez vous m'orienté vers un tuto ou des explications. je continu a chercher

    je veut le faire a part de m'a form d'origine car j'aurais a l'utilisé pour plusieurs chose

    merci de votre aide

  2. #2
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    salut,

    en se basant sur un BackgroundWorker plutôt qu'un véritable 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    // fenetre classique contenant une progressbar
        // en cas de fermeture préalable, le traitement sera arrétée
        // ele se ferme auto quand le traitement est fini
        public partial class FormWait : Form
        {
            BackgroundWorker bgw;
     
            public FormWait(DoWorkEventHandler MyAsyncMethod)
            {
                InitializeComponent();
     
                bgw = new BackgroundWorker();
                bgw.WorkerReportsProgress = true;
                bgw.WorkerSupportsCancellation = true;
                bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(EndOfWork);
                bgw.ProgressChanged += new ProgressChangedEventHandler(ReportProgressOnProgressBar);
                bgw.DoWork += MyAsyncMethod;
                bgw.RunWorkerAsync();
            }
     
            private void EndOfWork(object sender, RunWorkerCompletedEventArgs evt)
            {
                this.Close();
            }
     
            private void ReportProgressOnProgressBar(object sender, ProgressChangedEventArgs evt)
            {
                this.pgbWait.Value = evt.ProgressPercentage;
            }
     
            private void OnClose(object sender, EventArgs evt)
            {
                bgw.CancelAsync();
                this.Close();
            }
        }
     
        class TaClasseDeTraitement
        {
            // cette méthode est l'argument à donner au constructeur de ta fenêtre d'attente
            public void TonTraitement(object sender , DoWorkEventArgs evt)
            {
                BackgroundWorker b;
                if (sender != null && sender.GetType() == typeof(BackgroundWorker))
                    b = sender as BackgroundWorker;
                else //cette méthode peut être appelée depuis aillerus que ta fenêtre d'attente
                    b = new BackgroundWorker();
     
                // traitement
                b.ReportProgress(10);
                // traitement à nouveau
                b.ReportProgress(20);
                // etc...
            }
        }
    C'est pas parfait, mais ça devrait bien fonctionner

    @+

  3. #3
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Je connaissais pas du tout un BackgroundWorker . je vais tester sa, merci beaucoup

  4. #4
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Il me met une erreur sur

    Erreur:
    Ce BackgroundWorker précise qu'il ne signale aucune progression. Modifiez WorkerReportsProgress afin qu'il signale bel et bien une progression.
    Je cherche de mon coté.

    Et il faudrait que je puisse initialisé le progressbar avec la valeur maximum.

  5. #5
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Etrange,

    si tu as bien mit cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bgw.WorkerReportsProgress = true;
    ça devrait marcher.

  6. #6
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par thelpi Voir le message
    Etrange,

    si tu as bien mit cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bgw.WorkerReportsProgress = true;
    ça devrait marcher.
    Oui oui, j'ai bien mis, j'ai fait un copier coller.

  7. #7
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Tu peux me montrer ton code ?
    pas celui du détail de ton traitement, mais surtout celui de l'appel de la fenêtre

  8. #8
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par thelpi Voir le message
    Tu peux me montrer ton code ?
    pas celui du détail de ton traitement, mais surtout celui de l'appel de la fenêtre

    Voici le code de m'a form, rien n'est optimisé car c'est vraiment brut de fonderie.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    using System;
    using System.Collections.Generic;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Threading;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            bool Util;
            int Nb;
            public Form1()
            {
                InitializeComponent();
                Util = false;
            }
     
            private void buttonCree_Click(object sender, EventArgs e)
            {
                if (!Util)
                {
                    Util = true;
                    Nb = Convert.ToInt32 (textBoxNB.Text);
                    StreamWriter MonTexte = new StreamWriter("essaie.txt");
                    for (int i = 1; i <= Nb; i++)
                    {
                        MonTexte.WriteLine("Ligne :" + i.ToString());
                    }
                    MonTexte.Close();
                    listBox1.Items.Clear();
                    listBox1.Items.Add("Ecriture terminer");
                }
                Util = false;
            }
     
            private void buttonCharger_Click(object sender, EventArgs e)
            {
                if (!Util)
                {
                    int i = 1;
                    // On crée notre 'manipulateur' de thread en y passant un 
                    // paramètre classique
                    //MyThreadHandle threadHandle = new MyThreadHandle(Nb, 0);
     
                    // On crée notre thread en y donnant comme méthode boucle, une
                    // méthode membre de notre manipulateur
                    //Thread t = new Thread(new ThreadStart(threadHandle.ThreadLoop));
     
                    // La méthode ThreadLoop de l'objet threadHandle est appelée, et myParam est donc accessible!
                    //t.Start();
                    BackgroundWorker b;
                    if (sender != null && sender.GetType() == typeof(BackgroundWorker))
                        b = sender as BackgroundWorker;
                    else //cette méthode peut être appelée depuis aillerus que ta fenêtre d'attente
                        b = new BackgroundWorker();
     
                    listBox1.Items.Clear();
                    Util = true;
                    ArrayList FichierTxt = new ArrayList();
                    StreamReader MonTexte = new StreamReader("essaie.txt");
                    string ligne = null;
                    ligne = MonTexte.ReadLine();
                    while (ligne != null)
                    {
                        b.ReportProgress(i);
     
                        //threadHandle.MajProgressbar (i);
                        listBox1.Items.Add(ligne);
                        FichierTxt.Add(ligne);
                        ligne = MonTexte.ReadLine();
                        i++;
                    }
                    MonTexte.Close();
                    listBox1.Items.Add("lecture terminer");
                    listBox1.SelectedItem = "lecture terminer";
                    //t.Abort();
     
                }
                Util = false;
            }
        }
    }
    Voici le code de la BackgroundWorker:

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public partial class FormWait : Form
        {
            BackgroundWorker bgw;
     
            public FormWait(DoWorkEventHandler MyAsyncMethod)
            {
                InitializeComponent();
                bgw = new BackgroundWorker();
                bgw.WorkerReportsProgress = true;
                bgw.WorkerSupportsCancellation = true;
                bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(EndOfWork);
                bgw.ProgressChanged += new ProgressChangedEventHandler(ReportProgressOnProgressBar);
                bgw.DoWork += MyAsyncMethod;
                bgw.RunWorkerAsync();
                //pgbWait.Maximum = Nb;
                //pgbWait.Minimum = 0;
     
            }
            private void EndOfWork(object sender, RunWorkerCompletedEventArgs evt)
            {
                this.Close();
            }
            private void ReportProgressOnProgressBar(object sender, ProgressChangedEventArgs evt)
            {
                this.pgbWait.Value = evt.ProgressPercentage;
            }
            private void OnClose(object sender, EventArgs evt)
            {
                bgw.CancelAsync();
                this.Close();
            }
        }
    }

  9. #9
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    A aucun moment tu n'appelles WaitForm depuis ta fenêtre principale ?

    Je réécrirai ton code de la façon suivante

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    private void buttonCharger_Click(object sender, EventArgs e)
    {
    	if (!Util)
    	{
    		new FormWait(MethodAsync).ShowDialog();
    	}
    }
     
    private void MethodAsync(object sender, DoWorkEventArgs evt)
    {
    	BackgroundWorker b;
    	if (sender != null && sender.GetType() == typeof(BackgroundWorker))
    		b = sender as BackgroundWorker;
    	else
    	{
    		b = new BackgroundWorker();
    		b.WorkerReportsProgress  = true;
    	}
     
     
    	int i = 1;
     
    	listBox1.Items.Clear();
    	Util = true;
    	ArrayList FichierTxt = new ArrayList();
    	StreamReader MonTexte = new StreamReader("essaie.txt");
    	string ligne = null;
    	ligne = MonTexte.ReadLine();
    	while (ligne != null)
    	{
    		b.ReportProgress(i);
    		listBox1.Items.Add(ligne);
    		FichierTxt.Add(ligne);
    		ligne = MonTexte.ReadLine();
    		i++;
    	}
    	MonTexte.Close();
    	listBox1.Items.Add("lecture terminer");
    	listBox1.SelectedItem = "lecture terminer";
    }

  10. #10
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Merci beaucoup, par contre j'ai des petits souci,
    Dans la méthode appeler "MethodAsync" je ne peut pas accéder à la modification de la listBox car il m'indique je ce n'est pas le même thread.

    je l'ai fait donc à la fin et cela marche.

    mais la Form de la progressbar est elle aussi complètement bloquer mise a par la mise a jour de cette même progressbar.

    je vois bien l'évolution de cette progressbar mais cela n'affiche pas le label que j'ai mis dans cette même form.

    Je vais cherché, merci de votre aide.

  11. #11
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Si tu veux faire "quick and dirty" , tu peux laisser la progressbar et le label sur la forme d'origine et, pour mettre à jour la progression, faire Application.DoEvents().

Discussions similaires

  1. Problème pour lancer une application avec Java
    Par bintij dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 23/10/2011, 20h49
  2. Comment utiliser jsGraphics pour dessier une forme avec du texte dessus
    Par derzy971 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/04/2010, 02h35
  3. [DOM] Onmouseover pour lancer une fonction avec arguments
    Par Trock dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 01/06/2007, 13h31
  4. [D7] Lancer une form avec un effet graphique
    Par dacid dans le forum Delphi
    Réponses: 21
    Dernier message: 25/05/2007, 11h05
  5. Comment attendre que tous les thread lancés soient morts pour lancer une action.
    Par rgesnot dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 31/03/2007, 20h27

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