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

Windows Forms Discussion :

[C#] autoriser un thread a modifer les controls d'un autre


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2003
    Messages : 22
    Points : 25
    Points
    25
    Par défaut [C#] autoriser un thread a modifer les controls d'un autre
    Salut,

    La petite histoire : c'est un thread qui doit modifier les controles d'une fenetre appartenant à un autre thread... seulement, il ne veux pas le faire car c'est pa le meme thread mais moi je voudrais qu'il puisse le faire.
    Y'a til une solution ou je dois changer mon code et le mettre au niveau du meme thread ?
    Merci d'avance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PropertyInfo ThemableProperty;
    ...
    //control est le controle a modifier
    ThemableProperty.SetValue(control, new Font(prop.Attributes["fontfamily"].Value,                                  (float)Convert.ToDecimal(prop.Attributes["size"].Value), FontStyle.Regular), null);
    L'exception levée :
    L'exception System.Reflection.TargetInvocationException n'a pas été gérée
    Message="Une exception a été levée par la cible d'un appel."

    inner exception :
    Opération inter-threads non valide : le contrôle 'codeLabel' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.

  2. #2
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Salut .

    il faut que tu passes par la méthode Invoke du controle en question.

    je te laisse allez t'informer plus amplement sur la MSDN.
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    j'ai eu le même problème il y a plsuieurs solution :
    - Soit tu es en FW2.0 et la tu peut utiliser les BackgroudWorker a la place des thread et en utilisant l'event OnProgress, tu pourra modifier les controle de ton thread
    - Soit tu cree une variable plsu "globale a ta classe" et la c'est pas tres propre mais ça marche
    - La derniere, c'est aussi la plus simple mais la plus dangeureuse au niveau sécurité si tu es sûr de ce que tu fait , tu doit passer la propriété CheckForIllegalCrossThreadCalls a false avant de faire start sur ton thread, et le remettre a true des que tu n'as plus besoin de modifier les controles de ton autre thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Thread monThread = new Thread(monInstance.maFonction);
    CheckForIllegalCrossThreadCalls = false;
    monThread.Start();
    ...
    //je n'ai plsu besoin de manipuler des objets a travers d'autre thread
    CheckForIllegalCrossThreadCalls = true;
    Voilà j'espere t'avoir aidé
    1 || 1 = 1
    1 && 1 = 1
    1 * 1 = 1
    Bon après tout, peut-être que Van Damme avait raison :
    1 + 1 = 1 // harmonie parfaite

  4. #4
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par ekinox17
    - La derniere, c'est aussi la plus simple mais la plus dangeureuse au niveau sécurité si tu es sûr de ce que tu fait , tu doit passer la propriété CheckForIllegalCrossThreadCalls a false avant de faire start sur ton thread, et le remettre a true des que tu n'as plus besoin de modifier les controles de ton autre thread:
    c'est pas dangereux c'est suicidaire.

    Encore une fois supprimer les messages d'erreur parce qu'ils vous embetent, ça n'est pas la bonne solution ...

    Pour reprendre ce que je disais dans le thread ou cette "solution" a été proposer, c'est comme de tuer le messagé qui t'apporte une mauvaise nouvelle, tu n'auras pas la nouvelle mais elle existe quand même ...

    Sinon le backgroundWorker est une bonne solution assez simple.
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2003
    Messages : 22
    Points : 25
    Points
    25
    Par défaut
    Je vais regarder les deux solutions (invoke et backgroundworker)
    merci

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par dev01 Voir le message
    Sinon le backgroundWorker est une bonne solution assez simple.
    Le backgroundWorker permet il d'effectuer un compte rendu textuel de son déroulement ?
    Je m'explique, j'ai une série de requête SQL très gourmande en temps et qui renvoient chacune un ou plusieurs enregistrements à afficher dans le formulaire de base.
    Je voudrais que leurs traitements soient effectués dans un ordre précis mais que cela ne bloque pas le formulaire de démarrage.
    Quelqu'un a t il une idée ?

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

Discussions similaires

  1. Utiliser les controles d'une autre form
    Par andrebernard dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/10/2010, 18h34
  2. Colorier les controles d'une DLG
    Par tonycalv dans le forum MFC
    Réponses: 7
    Dernier message: 11/01/2008, 08h48
  3. Réponses: 5
    Dernier message: 07/09/2005, 08h27
  4. Réponses: 4
    Dernier message: 05/09/2005, 11h13
  5. [MFC] Recuperer tout les control d'un CDialog
    Par mickaelguilbert dans le forum MFC
    Réponses: 6
    Dernier message: 11/08/2005, 11h04

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