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#]Cross-thread operation not valid


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    hrp
    hrp est déconnecté
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Par défaut [C#]Cross-thread operation not valid
    Bonjour,

    j'aimerai créer une class possédant des événements. Cette class lance également un thread qui va déclancher l'événement. Dans le code où est instancier un objet de cette class, j'abonne une méthode à l'événement. Dans cette méthode je modifie la propriété text d'un objet RichTextBox. Lorsque l'événement survient la méthode abonnée à l'événement s'éxécute bien mais une exception survient au momment de la modification du RichTextBox. Ceci survient car l'appel de cette méthode provient d'un autre thread que celui où est instancié l'objet RichTextBox. Une solution est d'utiliser la méthode BeginInvoke et de lui passer une méthode delegate.
    Cependant existe-t-il une autre solution permettant d'éviter l'utilisation de la méthode BeginInvoke?
    En fait j'aimerai que l'utilisateur de la class générant les événements n'ai pas à ce soucier des problèmes de "Cross-thread operation not valid"

    Merci pour votre support

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 238
    Par défaut
    Salut,
    D'un point de vu sécurité il est interdit à un Thread de pouvoir modifier un composant graphique qu'il n'a pas crée lui-même. Ca permet d'éviter des conflit d'accès aux ressources.
    Mais il y a moyen de supprimer cette sécurité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CheckForIllegalCrossThreadCalls = false;
    pose cette ligne de code avant de faire le start de ton premier Thread et ca devrait marché sans pb !

    Bonne chance

  3. #3
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Citation Envoyé par Biloutor
    Salut,
    D'un point de vu sécurité il est interdit à un Thread de pouvoir modifier un composant graphique qu'il n'a pas crée lui-même. Ca permet d'éviter des conflit d'accès aux ressources.
    Mais il y a moyen de supprimer cette sécurité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CheckForIllegalCrossThreadCalls = false;
    pose cette ligne de code avant de faire le start de ton premier Thread et ca devrait marché sans pb !

    Bonne chance
    Ta méthode est totalement à déconseiller. Si tu utilise cette méthode, aussi bien de toutes mettre tes class static et mettre tout les membre public. C'est sensiblement la meme chose.

    Si tu veux acceder a un composant, utilise un invoke pour changer de thread.

    Aussi, si tu veux voir comment fonctionne le onclick d'un bouton, je te conseille de downloader un reflector .

  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
    Par défaut
    Citation Envoyé par shwin
    Ta méthode est totalement à déconseiller.
    +1. Si les opérations cross thread sont interdites c'est qu'il y a une (des) raisons pour ça. Supprimer les messages d'erreur n'est pas synonime de résolution de problème. C'est comme de tuer le messager pour pas avoir les mauvaises nouvelles ...

  5. #5
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Citation Envoyé par dev01
    +1. Si les opérations cross thread sont interdites c'est qu'il y a une (des) raisons pour ça. Supprimer les messages d'erreur n'est pas synonime de résolution de problème. C'est comme de tuer le messager pour pas avoir les mauvaises nouvelles ...
    Belle comparaison

  6. #6
    hrp
    hrp est déconnecté
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Par défaut Cross-thread operation not valid
    Merci à shwin,
    je vais analyser un peu avec le reflector. Cette outil est géniale! merci beaucoup pour votre aide.
    @+
    hrp

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 5
    Par défaut
    Salut,
    J'ai été face au même problème que toi.
    La solution que j'ai mis en place pour ce problème, c'est de mettre toutes les modifs que j'avais a faire sur mes objets graphiques dans la classe de mon ihm.
    Ensuite dans cette méthode, tu dois mettre en place le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    delegate void dMaMethode();
    public void maMethode()
    {
       if (this.InvokeRequired)
       {
           dMaMethode d = new dMaMethode(maMethode);
           this.Invoke(d);
       }
       else
       {
           //ton traitement
       }
    }
    Tu appelera cette methode dans la méthode qui reçoit l'evenement. Et là, normalement ya plus aucun problème .

    J'espere que j'ai été clair et que ça pourra t'aider...

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 238
    Par défaut
    Ma réponse fonctionne, tu devrais l'essayer yagosacquet, je pense que c'es plus simple que ta proposition.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 5
    Par défaut
    C'est trop tard, j'ai déjà mis en place ma méthode partout (long, très long...)
    La méthode que je propose est pas si compliqué que ça (c'est celle qui est proposé sur msdn pour résoudre les problèmes de cross threading).
    Bon c'est sur ta méthode est beaucoup plus simple .

  10. #10
    hrp
    hrp est déconnecté
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Par défaut Cross-thread operation not valid
    La méthode que propose yagosacquet est celle que j'utilise aussi, la méthode de Biloutor ne me plaît pas car il faut prendre en compte la synchronisation entre les le thread générant l'événement et le thread de l'IHM.

    Bref, mon problème n'est cependant pas complètement résolu. En fait avec la méthode de yagosacquet ça fonctionne très bien mais l'utilisateur de la classe générant l'événement doit savoir qu'il doit utiliser la méthode Invoke().
    Moi j'aimerai faire en sort qu'il n'a pas besoin de savoir tout ça.
    Lorsqu'on utilise un composant System::Windows::Forms::Button, il n'est pas nécéssaire d'utiliser la méthode Invoke() dans la methode System::Void buttonXY_Click(System::Object^ sender, System::EventArgs^ e). Comment est solutionné l'appel de cette événnement OnClick dans las classe System::Windows::Forms::Button?
    J'aimerai aboutir au même résultat...
    Est-ce possible?
    Merci
    hrp

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

Discussions similaires

  1. Thread : Operation inter-threads non valide
    Par conan76 dans le forum VB.NET
    Réponses: 13
    Dernier message: 14/05/2015, 22h50
  2. Cross-thread operation not valid && serialport
    Par vince_lille dans le forum Windows Forms
    Réponses: 4
    Dernier message: 20/04/2007, 11h57
  3. [VB.NET]Erreur "invalid cross-thread operation"
    Par NicolasJolet dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/04/2006, 12h38
  4. xhtml ->xml xsl:attribute name+not valid
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 14/06/2005, 07h27
  5. Réponses: 2
    Dernier message: 19/04/2005, 15h29

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