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 :

Accès en ecriture a une fenetre Windows à partir d'un thread


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Par défaut Accès en ecriture a une fenetre Windows à partir d'un thread
    Bonjour,
    J'ai plusieurs instance de classe qui sont exécuté dans des threads. Ces classes sont responsable à l'exécution d'un ensemble de traitements et à l'affichage des résultats dans des fenêtres Windows.
    Le problème c'est que l’accès à une fenêtre à partir d'un thread est interdit.

    Qui peux m'aider à trouver la meilleurs solution pour ça?
    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Par défaut
    interdit ? Qu'a tu comme message d'erreur ? erreur compilation ? exception ? soit plus precis stp et n'hesite pas a mettre un bout de code pour que l'on comprenne bien ton problème.

  3. #3
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Effectivement il n'est pas possible d'agir sur le main thread (UI) depuis un worker thread. Il existe plusieurs mécaniques, mais pour t'aider il faudrait en savoir plus sur ce que tu utilises :
    - BackgroundWorker ?
    - Tasks ?
    - Threads ?

    Comme l'a dit djchou, il faudrait aussi savoir ce que tu cherches à faire, et un bout de code ne sera pas de trop !
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  4. #4
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Par défaut
    Oui vous avez raison, mais désolé je ne peux pas mettre mon code par ce que c'est dans un cadre professionnel.
    Mais voila j'ai fais un exemple qui illustre mon problème.

    J'ai ici une instance d'une classe personne dans je veux afficher ses paramètres dans Form1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Personne
    {
         public string Nom { get; set; }
        public string Prenom { get; set; }
        public int Age { get; set; }
     
        public Personne ()
        {
            Nom = "Mon Nom";
            Prenom = "Mon Prenom";
            Age = 27;
        }
    }
    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 Form1 : Form
    {
        Personne Moi = new Personne ();
     
        public Form1()
        {
            InitializeComponent();
        }
     
        private void AfficherPersonne()
        {
            TB_Nom.Text = Moi.Nom;
            TB_Prenom.Text = Moi.Prenom;
            TB_Age.Text = Moi.Age.ToString();
        }
     
        private void BT_AfficherPersonne_Click(object sender, EventArgs e)
        {
            Thread ThreadPersonne = new Thread (AfficherPersonne);
            ThreadPersonne.Start();
        }
    }
    Lors de l'exécution de la fonction BT_AfficherPersonne_Click l’exception suivante aura lieu.
    Opération inter-threads non valide : le contrôle 'TB_Nom' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.

    Dans cette cas je sais que je peux utiliser soit les "delegate" soit les "event" c'est a dire je lance un événement a la fin du ThreadPersonne pour exécuter la fonction AfficherPersonne() mais il me semble que ces deux méthodes sont (tiré par les cheveux) (demande beaucoup de déclarations)
    Je cherche une méthode plus professionnel.

  5. #5
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Par défaut
    Ce n'est pas forcement tiré par les cheveux

    Vous pouvez sinon utiliser le BackgroundWorker comme l'a indiqué DotNetMatt. Il utilise aussi un évenement (ProgressChanged).

    Pour ma part mes threads utilisent différents events pour communiquer avec ma couche de présentation.

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Par défaut
    Perso, j'utilise les threads pour gagner en perf sur des traitement assez lourd
    Si tu veux un "truc" plus professionnel, sépare déjà tes couches :
    pour ma part j'utilise soit le MVC ou le MVP selon les appli mais dans tous les cas, dans ma form j'ai uniquement le code dedié aux composants. La création des instrances se fait dans une autre couche presenter/manager et la tu as quelque chose de bcp plus pro.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/02/2006, 16h21
  2. [VB.net] Acces aux controles d'une form a partir d'une autre
    Par Fab62_ dans le forum Windows Forms
    Réponses: 3
    Dernier message: 25/01/2006, 12h47
  3. [C#] Comment recharger une fenetre windows
    Par nokta dans le forum Windows Forms
    Réponses: 3
    Dernier message: 29/11/2005, 18h54
  4. Le dessin avec VC dans une fenetre windows
    Par ccensam dans le forum MFC
    Réponses: 3
    Dernier message: 03/11/2005, 23h40
  5. Réponses: 2
    Dernier message: 24/03/2004, 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