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 :

Utilisation des Delegate sur des Threads


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Points : 141
    Points
    141
    Par défaut Utilisation des Delegate sur des Threads
    Bonjour !

    Voila, j'ai une petite appli qui effectue un traitement assez 'long' à un moment donné, et je veux ajouter sur ma Form principale, un bouton annulé.
    Sauf que, pendant le traitement, la form ne peut pas être utilisée (le thread ayant créé la form traite mon travail en cours).

    Donc, je me suis mis dans l'idée de créer un thread qui exécuterait mon traitement qui est long, comme ca, ma Form reste utilisable.

    Jusque la je pense être sur la bonne voie non ?

    Je me suis retrouvé confronté à une erreur imprévue, celle où mon thread exécutant le traitement, doit modifier la Form, pour faire avancer une ProgressBar.

    En fouillant sur le Net, j'ai trouvé des choses parlant de Delegate.
    Mais, j'ai du mal à m'en servir, aussi pouvez vous m'aider?

    Voici du code illustrant mes questions :

    Déclaration de ma méthode délégué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private delegate void SetProgressBar(int iMaxValue, int iValue,int iStepValue,int iMinValue);
     
    private void SetProgressBarValue(int iMaxValue, int iValue, 
    int iStepValue, int iMinValue)
    {
                myProgressBar.Maximum = iMaxValue;
                myProgressBar.Value = iValue;
                myProgressBar.Step = iStepValue;
                myProgressBar.Minimum = iMinValue;
    }
    Lors d'un click sur un bouton, je créé mon Thread qui exécute le traitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void Button_Reprodesk_Click(object sender, EventArgs e)
    {
                //PrepareListForReprodesk();
                Thread myThread = new Thread(new ThreadStart(PrepareListForReprodesk));
                myThread.Start();
    }
    Et donc, c'est ma méhode : PrepareListForReprodesk, qui à un moment doit modifier ma Form, donc dans la méthode PrepareListForReprodesk, je dois normalemnt appeler ma méthode Délégué non ?

    J'ai beau essayer différents appels, ca ne marche pas, j'ai un léger problème de syntaxe.

    J'ai essayé dernièrement ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invoke(new SetProgressBar(SetProgressBarValue(tabLineFromFile.Length * 2, 0, 1, 0)));
    Mais j'ai une erreur :
    Nom de méthode attendue.

    Je suis un peu paumé la..

    Merci

  2. #2
    Membre confirmé Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Points : 527
    Points
    527
    Par défaut
    Bonjour pour faire simple il existe les backgroundworker :
    http://msdn.microsoft.com/fr-fr/libr...8VS.80%29.aspx

    Sinon concernant l'utilisation des délégates et thread c'est un peu plus complexe.
    Tu as de la chance j'ai réalisé une petite appli qui utilise notamment un thread qui utilise une progressbar voici l'exemple :

    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
    public delegate void ChangeValue(ProgressBar pgb, int value);
    public delegate void ChangeMAX(ProgressBar pgb, int value);
     
     public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
            }     
     
            private void button2_Click(object sender, RoutedEventArgs e)
            {           
     
                Thread T1 = new Thread(WAIT);
                T1.Start();           
            }
     
            public void ChangeValueMethod(ProgressBar pgb, int value)
            {
                pgb.Value = value;
            }          
     
            private void WAIT()
            {
                while (true)
                {
                    for (int i=0; i <= 100; i++)
                    {
                        if (i == 100)
                            i = 0;
     
                        Dispatcher.Invoke(new ChangeValue(ChangeValueMethod),this.progress,i);
                    }
                }
            }
     
    }
    ATTENTION : Mon code n'est pas terminé donc pour le moment le thread ne s'arrête pas à cause du "While(true)" de plus j'ai cru comprendre que vous travaillez en winform dans ce cas il ne faut pas utilisé le dispatcher mais un invoke sur la progressbar. L'exemple ici est en WPF.


    C'est un exemple simple mais efficace
    Je fais ce que je dis et je dis ce que je veux .

  3. #3
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Points : 141
    Points
    141
    Par défaut
    Entre temps, j'ai réussi à me débrouiller, j'avais donc crié trop tôt

    Voici comment j'ai procédé, avec les invoke(), j'ai préféré faire des déclarations d'objets un peu partout, histoire d'avoir un code clair pour ceux que ca pourrait aider :

    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
    public partial class Form_Main : Form
        {
            private SetProgressBar mySetProgressBarDelegate;
     
            private delegate void SetProgressBar(int iMaxValue, int iValue,int iStepValue,int iMinValue);
     
            private void SetProgressBarValue(int iMaxValue, int iValue, int iStepValue, int iMinValue)
            {
                myProgressBar.Maximum = iMaxValue;
                myProgressBar.Value = iValue;
                myProgressBar.Step = iStepValue;
                myProgressBar.Minimum = iMinValue;
              }
     
     
              public Form_Main()
              {
                mySetProgressBarDelegate = new SetProgressBar(SetProgressBarValue);
     
                InitializeComponent();
     
             }
    }

    Donc au final, dans la méthode appelée par mon thread, j'utilise un code du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Invoke(mySetProgressBarDelegate,tabLineFromFile.Length * 2, 0, 1, 0);
    Petite question, pourquoi passes tu à ta méthode un paramètre de type ProgressBar ?
    Dans le cas ou tu en aurai plusieurs sur ta Form ?

    Merci

  4. #4
    Membre confirmé Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Points : 527
    Points
    527
    Par défaut
    Non, c'est car je suis en WPF donc il faut que le dispatcher sache quel progressbar modifier car en WPF seul le thead créateur du control peut le modifier.
    Cela dit effictivement ça permet également de gérer plusieurs progessbar.
    Par contre dans cas il me semble qu'il faut que tu fasse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myProgressBar.Invoke(mySetProgressBarDelegate,tabLineFromFile.Length * 2, 0, 1, 0);
    As-tu déjà essayé ?
    Je fais ce que je dis et je dis ce que je veux .

  5. #5
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Points : 141
    Points
    141
    Par défaut
    Oui sans le this, cela fonctionne, d'ailleurs il n'est présent que sur le code que j'ai mis dans mon post.

    sur mon développement je ne l'ai pas.

  6. #6
    Membre confirmé Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Points : 527
    Points
    527
    Par défaut
    Nikel
    Je fais ce que je dis et je dis ce que je veux .

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

Discussions similaires

  1. Comment ajouter des séries dans des graphes sur des feuilles variables
    Par Molomarcopolo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/07/2012, 16h26
  2. Trigger pour mettre des droits sur des procedures et des vues
    Par briino dans le forum Développement
    Réponses: 3
    Dernier message: 23/09/2009, 09h44
  3. Utiliser JOGL + shader pour des effets sur des images 2D.
    Par nouknouk dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 19/12/2007, 10h46
  4. [RegEx] utilisation de preg_replace sur des balises
    Par Kerod dans le forum Langage
    Réponses: 5
    Dernier message: 09/12/2005, 13h46
  5. Réponses: 6
    Dernier message: 10/06/2005, 23h56

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