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 :

Problème thread dans une autre classe


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut Problème thread dans une autre classe
    Bonjour,

    Surement une question toute bête mais je me prends la tête depuis un petit moment donc j'aurais besoin d'un petit coup de pouce.

    Voici mon code ( c'est un 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
    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
    using System; 
    using System.Drawing; 
    using System.Collections; 
    using System.ComponentModel; 
    using System.Windows.Forms; 
    using System.Data; 
    using System.Threading; 
     
    namespace ControlInvokeSample 
    { 
        public class Form1 : System.Windows.Forms.Form 
        { 
            private System.Windows.Forms.Label label_Affichage; 
            private System.Windows.Forms.Button button_Start; 
            private System.ComponentModel.Container components = null; 
     
            public Form1() 
            { 
                InitializeComponent(); 
            } 
     
            protected override void Dispose( bool disposing ) 
            { 
                if( disposing ) 
                { 
                    if (components != null) 
                    { 
                        components.Dispose(); 
                    } 
                } 
                base.Dispose( disposing ); 
            } 
     
            #region Code généré par le Concepteur Windows Form 
            /// <summary> 
            /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas 
            /// le contenu de cette méthode avec l'éditeur de code. 
            /// </summary> 
            private void InitializeComponent() 
            { 
                this.label_Affichage = new System.Windows.Forms.Label(); 
                this.button_Start = new System.Windows.Forms.Button(); 
                this.SuspendLayout(); 
                // 
                // label_Affichage 
                // 
                this.label_Affichage.Location = new System.Drawing.Point(8, 40); 
                this.label_Affichage.Name = "label_Affichage"; 
                this.label_Affichage.Size = new System.Drawing.Size(472, 72); 
                this.label_Affichage.TabIndex = 0; 
                // 
                // button_Start 
                // 
                this.button_Start.Location = new System.Drawing.Point(8, 8); 
                this.button_Start.Name = "button_Start"; 
                this.button_Start.TabIndex = 1; 
                this.button_Start.Text = "Start"; 
                this.button_Start.Click += new System.EventHandler(this.button_Start_Click); 
                // 
                // Form1 
                // 
                this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); 
                this.ClientSize = new System.Drawing.Size(488, 117); 
                this.Controls.Add(this.button_Start); 
                this.Controls.Add(this.label_Affichage); 
                this.Name = "Form1"; 
                this.Text = "Form1"; 
                this.ResumeLayout(false); 
     
            } 
            #endregion 
     
            [STAThread] 
            static void Main() 
            { 
                Application.Run(new Form1()); 
            } 
     
            // **************** 
            // définition du delegate qui sera utilisé 
            private delegate void UpdateLabelDelegate ( string text ); 
            // **************** 
     
            private UpdateLabelDelegate m_upLbl; 
            private Thread m_monThread; 
     
     
            private void button_Start_Click(object sender, System.EventArgs e) 
            { 
                button_Start.Enabled = false; 
     
                // affectation du nom du thread courant 
                Thread.CurrentThread.Name = "Thread principal"; 
     
                // initialisation de l'instance de UpdateLabelDelegate qui sera utilisée dans le thread 
                m_upLbl = new UpdateLabelDelegate(this.MaMethodeDeMajDuLabel); 
     
                // création et lancement du thread "supplémentaire" 
                m_monThread = new Thread(new ThreadStart(this.ThreadProc)); 
                m_monThread.Name = "Thread supplémentaire"; 
                m_monThread.Start(); 
            } 
     
            private void ThreadProc() 
            { 
                // le tableau d'object qui sera utilisé pour le passage des paramètres. 
                object [] args = new object[1]; 
     
                for ( int i=0; i<=10; i++) 
                { 
                    // affectation du texte, c'est lui qui sera reçu en paramètre "text" de notre méthode 
                    args[0] = string.Format("{0} (depuis : {1})", i.ToString(), Thread.CurrentThread.Name); 
     
                    // **************** 
                    label_Affichage.Invoke(m_upLbl, args); 
                    // **************** 
     
                    // petite pause 
                    Thread.Sleep(500); 
                } 
     
                args[0] = string.Format("C'est fini :-) (depuis : {0})", Thread.CurrentThread.Name); 
                label_Affichage.Invoke(m_upLbl, args); 
            } 
     
            // **************** 
            // la méthode correspondant à la déclaration de UpdateLabelDelegate 
            // qui fera la MAJ du texte du Label dans le thread auquel appartient le contrôle. 
            private void MaMethodeDeMajDuLabel(string text) 
            { 
                // MAJ du texte en ajoutant le nom du thread depuis lequel cette maj est faite. 
                label_Affichage.Text = string.Format("{0}\r\nLabel mis à jour depuis : {1}", text, Thread.CurrentThread.Name);
            } 
            // **************** 
        } 
    }
    Ma demande porte sur le fait de savoir comment puis je mettre la fonction 'ThreadProc' dans une autre classe car je veux différencier l'affichage de mon traitement.

    Merci de votre aide !
    http://stef-le-buffle.labrute.com

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Je ne vois pas le problème. Qu'est ce qui t'empèche de le faire ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Je ne vois pas le problème. Qu'est ce qui t'empèche de le faire ?
    Je ne sais pas gérer les délégués en relation avec ma form à partir d'une autre classe.
    http://stef-le-buffle.labrute.com

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Tu déclares MaMethodeDeMajDuLabel en public et tu l'appelles depuis l'autre classe.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  5. #5
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    La déclaration de mon délégué, je le laisse dans ma classe 'Form1' ?
    Comment je fais dans mon autre classe pour appeler ma méthode 'label_affichage.invoke' ?
    http://stef-le-buffle.labrute.com

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 58
    Points : 74
    Points
    74
    Par défaut
    Ton besoin est de réutiliser ce traitement dans la mm form pour plusieurs lablel ou bien réutiliser le traitement pour plusieurs forms?

  7. #7
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par varod Voir le message
    Ton besoin est de réutiliser ce traitement dans la mm form pour plusieurs lablel ou bien réutiliser le traitement pour plusieurs forms?
    Salut,

    Ce que je souhaite c'est créer une classe où j'aurais tout mes traitements.
    Concrètement, je veux mettre la méthode appelée par le second thread 'ThreadProc' dans une autre classe tout en pouvant faire ce que je fais actuellement pour la mise à jour de l'interface utilisateur.

    Merci.
    http://stef-le-buffle.labrute.com

  8. #8
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Personne ne voit mon problème ?
    http://stef-le-buffle.labrute.com

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 58
    Points : 74
    Points
    74
    Par défaut
    Bien que je ne suis pas certains d'une très grande utilité à faire cela, la solution qui me vient à l'esprit c'est de mettre tes labels et autres dans une visibilité public mais c'est pas très propre ... sinon en plus propre, il me semble qu'il y a une possibilité de passer un argument à un thread dans lequel tu passerais ton label à traiter...

    Vince.

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    C'est illégal pour des problème de synchronisation... un thread extérieur, n'est pas autorisé a bidouillé les controles fenetrer. Seul le thread de la pompe de messages est autorisé à modifier l'état des controles.

    Bien que ce soit "illégal", a la compilation ca marche...

  11. #11
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Vous êtes en train de me dire qu'il n'est pas utile que je mette mon second thread dans une autre classe et que tout le traitement de données de mon application se fera dans la même classe que mon thread principal ?

    Pourtant on m'a toujours conseillé de séparer la gestion de l'interface et les traitements de données.
    Je pense que la plupart des applications commerciales font ce que l'on m'a conseillé non ?

    enfin, qu'en pensez-vous ?
    http://stef-le-buffle.labrute.com

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 58
    Points : 74
    Points
    74
    Par défaut
    Il est clair qu'il faut séparer les traitements... mais ceux sont généralement les traitements métiers que l'on isole... ex : développement en 3-Tiers (IHM, Business, Data) ou alors MVC (Model, View, Controller).

    Dans ton cas, tu veux isoler un traitement IHM de l'IHM ... je ne pense pas que ce soit d'une grande utilité. Je ne sais pas si je suis bien clair ...

  13. #13
    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
    Points : 3 015
    Points
    3 015
    Par défaut
    Un abonnement à un évènement dans la partie affichage serait une solution, non ?
    'Traitement' déclenche l'évènement et l'affichage qui est abonné réceptionne.

    Est-ce que le fait d'avoir deux thread différents permet cela ? (je pense que oui)

  14. #14
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par varod Voir le message
    Il est clair qu'il faut séparer les traitements... mais ceux sont généralement les traitements métiers que l'on isole... ex : développement en 3-Tiers (IHM, Business, Data) ou alors MVC (Model, View, Controller).

    Dans ton cas, tu veux isoler un traitement IHM de l'IHM ... je ne pense pas que ce soit d'une grande utilité. Je ne sais pas si je suis bien clair ...
    Je te rassure, tu es assez clair.
    D'accord, donc vaut mieux que je mette le traitement de mon thread dans la même classe que ma form ?

    Un traitement métier est un traitement qui doit pouvoir être réutilisé dans d'autres applications tiers ? c'est ça ?

    Merci de ses renseignements.
    http://stef-le-buffle.labrute.com

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 58
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par Shypster Voir le message
    Je te rassure, tu es assez clair.
    D'accord, donc vaut mieux que je mette le traitement de mon thread dans la même classe que ma form ?

    Un traitement métier est un traitement qui doit pouvoir être réutilisé dans d'autres applications tiers ? c'est ça ?

    Merci de ses renseignements.
    Non pas tout a fait, un traitement métier peut être défini comme le comportement d'un de tes objets métiers, mais pour cela, il faut que tu utilises le coté objet de c#
    ex : tu es un concessionnaire auto, tu as dans ton modèle objet : plusieurs concessions, des voitures, des clients
    un traitement métier pourrait être ajouté une voiture à telle concession
    ou
    rechercher les voitures vendus à tel clients
    ...

    Dans ton cas ce n'est pas un traitement métier, sauf si tu essaies de mettre en place un comportement IHM complexe ... qui pourrait alors se traduire en comportement métier (dans le cas de la réalisation d'un composant par exemle) ce qui ne semble pas être le cas.

  16. #16
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Tu as raison, ce n'est pas un traitement métier, par contre que penses tu de l'idée de Binoo ?
    http://stef-le-buffle.labrute.com

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 58
    Points : 74
    Points
    74
    Par défaut
    Je pense qu'effectivement ce peut être une solution tout dépend de ce que tu veux faire au final ...

  18. #18
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par varod Voir le message
    Je pense qu'effectivement ce peut être une solution tout dépend de ce que tu veux faire au final ...
    Je veux faire un programme de copie, j'aurais voulu mettre mon traitement dans une autre classe mais si tu dis que c'est pas trés utile je te crois surtout que cela complique les choses apparement.

    Qu'en penses-tu pour une appli qui fera de la copie de dossiers ?

    Merci.
    http://stef-le-buffle.labrute.com

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 58
    Points : 74
    Points
    74
    Par défaut
    Bah écoute, dans le cas de la copie de fichier ... tout dépend ce que tu fais de ta copie.
    Si ton use case c'est je sélectionne un répertoire A et je précise la destination vers un répertoire B et que cela copie le contenu, il est n'est pas nécessaire de faire un traitement isoler, bien qu'il est tout de même nécessaire de faire une méthode CopieRep(string repA, string repB).
    Par contre, dans le cas, ou ta copie de répertoire est complexe ... je scrute le contenu des fichiers ... dans le cas ou il s'agit d'un fichier de type JPG, je le redimensionne et je le renomme MonFichier_800_600.jpg et pour terminer je compresse le repA pour le mettre dans un autre repertoire archive (repB) ... euh la, je pense que tu peux faire une classe dans lequel tu isoles le traitement

    Bon courage

  20. #20
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par varod Voir le message
    Bah écoute, dans le cas de la copie de fichier ... tout dépend ce que tu fais de ta copie.
    Si ton use case c'est je sélectionne un répertoire A et je précise la destination vers un répertoire B et que cela copie le contenu, il est n'est pas nécessaire de faire un traitement isoler, bien qu'il est tout de même nécessaire de faire une méthode CopieRep(string repA, string repB).
    Par contre, dans le cas, ou ta copie de répertoire est complexe ... je scrute le contenu des fichiers ... dans le cas ou il s'agit d'un fichier de type JPG, je le redimensionne et je le renomme MonFichier_800_600.jpg et pour terminer je compresse le repA pour le mettre dans un autre repertoire archive (repB) ... euh la, je pense que tu peux faire une classe dans lequel tu isoles le traitement

    Bon courage
    Ok merci, non c'est juste de la copie de dossier sur un disque réseau externe du moins actuellement car peut être que dans l'avenir le programme évoluera qui sait.

    Ok, merci d'avoir pris le temps de me répondre.
    http://stef-le-buffle.labrute.com

Discussions similaires

  1. [Graphics View] Problème de récupération de QList<QGraphicsItem *> dans une autre classe
    Par ChevalierN dans le forum Débuter
    Réponses: 13
    Dernier message: 07/01/2012, 18h04
  2. Réponses: 1
    Dernier message: 24/08/2009, 12h03
  3. Thread / Invoke / dans une autre classe
    Par totoz dans le forum VB.NET
    Réponses: 1
    Dernier message: 12/03/2009, 16h07
  4. [Thread] Reveiller un thread a partir d'un autre thread d'une autre classe
    Par arnolpourri dans le forum Concurrence et multi-thread
    Réponses: 18
    Dernier message: 11/04/2007, 15h18
  5. Réponses: 12
    Dernier message: 11/11/2005, 14h25

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