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 :

Petit problème avec un thread


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut Petit problème avec un thread
    Bonjour à tous,

    Je bloque sur un problème de threads.
    Je suis entrain de développer une petite application en c#.

    Ma form principale contient une progressBar et un bouton.
    Quand j'appuie sur mon bouton, je veux deux choses :

    1) Lancer un traitement
    2) Que pendant ce traitement, ma progressbar s'anime
    3) A la fin du traitement, je vais sur une autre form

    Je précise que ma progressbar n'est pas une progressbar incrémentale, mais une progresse bar de type "Marquee" ( celle qui va et vient).

    J'ai donc décidé de lancer mon traitement dans un thread.
    Le problème est qu'après la fin de mon thread, j'emboite sur mon autre form, et, j'ai donc un problème pour avoir le rafraichissement de ma form, et donc de voir ma progressbar animée.

    Je sais que je ne suis pas loin, mais je bloque.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private void menuItem1_Click_1(object sender, EventArgs e)
            {
              //Activation du timer qui va animer ma progressbar
                    this.marqueeTimer.Enabled = true;
    //Je passe ma progressbar à visible
                    this.progressBar10.Visible = true;
    //lancement de mon traitement
                    Thread monThread = new Thread(new ThreadStart(Form_Config_TV_1.MyTv.SetOperateurToSfr));
                }
    //Ouverture de mon autre form
                Program.maForm_Config_Fin.ShowDialog();
            }
    Je vous remercie tous d'avance de l'attention que vous porterez à mon message,

    Bien cordialement

    Nixeus

  2. #2
    Membre émérite
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Points : 2 424
    Points
    2 424
    Par défaut
    c 'est normal que ta ce problème car votre traitement de se lance sur autre thread, et ton thread principal continue son exécution qui va exécute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Program.maForm_Config_Fin.ShowDialog();
    tu peut utilise la synchronisation entre ton nouveau thread et ton thread principal avec ManualResetEvent/AutoResetEvent.
    ou déplace cette ligne sur ton 2 eme thread

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Bonsoir et tout d'abord merci de ta réponse,

    Je vais me renseigner sur ManualResetEvent/AutoResetEve

    Si tu as un exemples, je suis preneur

    Encore merci

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Ou tout bêtement juste après avoir lancé ton thread tu fais



  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    Moi j'utilise un objet que j'aime bien dans le domaine du multi-threading à savoir le BackGroundWorker!

    Il est assez simple à mettre en place, et permettrait de résoudre ton problème sans se prendre la tête, si toutefois j'ai bien cerné le souci.
    Je te mets ci dessous un petit exemple d'utilisation:

    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
     
    public class maClasse : System.Windows.Forms.Form
    {
          private Button btn_monButton;
          private BackgroundWorker bgw_MonThread;
          private ProgressBar pgb_progress;
     
          public maClasse()
          {
                InitializeComponent();
     
                //Là c'est du paramétrage que tu peux faire via VS (cela ira se mettre dans le designer)
                this.bgw_MonThread= new System.ComponentModel.BackgroundWorker();
                this.bgw_MonThread.WorkerReportsProgress = false;
                this.bgw_MonThread.WorkerSupportsCancellation = false;
                this.bgw_MonThread.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgw_MonThread_DoWork);
                this.bgw_MonThread.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.bgw_MonThreadnLnk_RunWorkerCompleted);
     
                this.btn_monButton = new System.Windows.Forms.Button();
                this.btn_monButton.Click += new System.EventHandler(this.btn_monButton_Click);
     
                this.pgb_progress = new System.Windows.Forms.ProgressBar();
                this.pgb_progress.Style = ProgressBarStyle.Marquee;
          }
     
          private void btn_monButton_Click(object sender, EventArgs e)
          {
                //Là tu intialise tout d'abord ta partie graphique
                this.marqueeTimer.Enabled = true;
                this.progressBar10.Visible = true;
     
                // puis tu démarres ton background
                bgw_MonThread.RunWorkerAsync();
          }
     
          private void bgw_MonThread_DoWork(object sender, DoWorkEventArgs e)
          {
                 //là où tu vas faire ton traitement
     
          }
     
          private void bgw_MonThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
          {
                //là où tu indiques ce que tu fais suite à ton traitement
                Program.maForm_Config_Fin.ShowDialog();
          }
    }
    Peut-être cela pourra-t-il t'aider?

    Bonne journée,

    Rastamath69

  6. #6
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    Je bosse sous le Compact Framework, BackGroundWorker et la méthode Wait ne sont pas dispo

    Je sais qu'il y a pourtant une solution, mais comment faire, faire un join() ?

    Merci à tous,

    Cordialement,

    Nixeus

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    j'ai écris wait en pensant join tu peux aussi faire plusieurs tests.

  8. #8
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Bonjour Hegros,

    Désolé pour mon retard, et merci de ta réponse.
    Je ne vois pas trop comment utiliser mon join.

    EN fait voici ce que j'ai fait

    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
     
                    Thread monThread = new Thread(new      ThreadStart(Form_Config_TV_1.MyTv.SetOperateurToSfr));
                    monThread.Start();
                    monThread.Join();
     
                    int i = 0;
                    int j = 0;
                    for (i = 0; i <= 100; i=i+1)
                    {
                        this.stTrack.AnimateValueTo(i);
                        if (this.stTrack.Value==100)
                        {
                            for (j = 100; j >= 0; j = j - 1)
                            {
                                this.stTrack.AnimateValueTo(j);
                            }
     
                        }
                    }
    Donc au début mon thread de traitement et lancé, et je veux que pendant que ce thread est lancé le reste avec les deux for soient éxécutés.

    COmment faire ?

    A note que tout ce code est dans l'évenement OnClick d'un bouton.

    Voila Voila,

    Encore merci

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    il ne faut pas faire de join alors tu appelles juste la méthode start et le code qui suit sera exécuté en parallèle avec le code que doit exécuter le thread que tu as started

  10. #10
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Bonjour Hegros, et merci de ta réponse.
    Si je comprends, bien, il me suffirait d'enlever le join() et mes deux threads seraient exécutés en parallèles ?

    Je vais tester cela le plus vite possible ! Merci encore

Discussions similaires

  1. Un petit problème avec les Threads
    Par Zikas-r dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 11/12/2008, 19h42
  2. Petit problème avec Line Input
    Par GrosQuicK dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/09/2005, 12h47
  3. (Petit ?) problème avec une page contenant du Flash
    Par ologram dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/09/2005, 18h45
  4. Petit problème avec SDL
    Par Nyarlathotep dans le forum C
    Réponses: 10
    Dernier message: 01/07/2005, 09h10
  5. Réponses: 5
    Dernier message: 10/05/2005, 10h22

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