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 :

Erreur inter-thread en utilisant le port serie


Sujet :

C#

  1. #1
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut Erreur inter-thread en utilisant le port serie
    Apres maintes utilisations d'event et d'invoke, je me retrouve avec une erreur qui me laisse perplexe.
    Alors voila, j'utilise un gestionnaire d'evenement de mon port serie, déclaré de la facon suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    portserie.DataReceived += new SerialDataReceivedEventHandler(this.Dll_Rs232_OnDataReceived);
    La fonction dans laquelle le programme va basculer lors d'un evenement est la suivante: Dll_Rs232_OnDataReceived. J'utilise un invoke sur un System.EventHandler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            private void Dll_Rs232_OnDataReceived(object sender, EventArgs e)
            {
                OnEvents evenements = new OnEvents();
    
                OnDataRecues.Invoke(this, evenements);
            }
    Concernant l'invoke, il est utilisé de la facon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_globale.m_Rs232.OnDataRecues += new System.EventHandler(this.OnTest);
    et la fonction qui le recoit est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            private void OnTest(object sender, EventArgs e)
            {
                textBox10.Text = ((OnEvents)e).DataRecues;
            }
    Et la, je me retrouve avec un message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Opération inter-threads non valide : le contrôle 'textBox10' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    Apres investigation, le souci vient du faite que je fasse l'invoke à l'interieur de la fonction delegate du à l'évenement SerialDataReceivedEventHandler

    J'ai fait le tour de mes idées, et je m'en remet aux votres.
    En vous remerciant pour votre aide.

    Cordialement,

    Léo V.V

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Tu ne peux pas invoquer une méthode sur un contrôle depuis une thread autre que celle qui a créé le contrôle.

    Ici, vraisemblablement, l'event dans lequel est invoqué ta propriété sur ton TextBox est issu d'un thread créé par l'objet portserie.

    Tu dois donc utiliser TextBox.Invoke pour utiliser la propriété.

    Tu peux tester cela préalablement via InvokeRequired

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  3. #3
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut
    Je te remercie Bluedeep, j'ai réussi à trouver. C'est ce que j'avais fais, mais de la facon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NomDuDelegate.Invoke(parametre);
    Ca ne fonctionnait pas.

    J'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invoke(NomDuDelegate, parametre);
    Et ca marche!

    Je suis bluffé, du coup je me demande: Et Pourquoi
    Mon collegue et moi meme sommes dépourvus de réponses...

    Encore merci pour la lumiere,

    Bien cordialement,

    Léo V.V.

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    De rien, mais n'oublie pas le tag

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  5. #5
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut
    J'ai pas coché, car je me demande pourquoi la premiere solution ne passe pas et la deuxieme oui????????

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par leo2v2o Voir le message
    J'ai pas coché, car je me demande pourquoi la premiere solution ne passe pas et la deuxieme oui????????
    OK; ta première solution utilise le thread du contexte dans lequel elle est appelée, celui du event handler; tu ne change donc pas de contexte. A l'inverse quand tu appelles la méthode Invoke d'un contrôle, tu change de contexte en demandant l'exécution dans le thread du contrôle.

    Est plus clair ?

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  7. #7
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut
    ABSOLUTELY

    Je coche résolu et souhaite un bon appetit.

    Bien cordialement,

    Léo V.V.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Citation Envoyé par leo2v2o Voir le message
    J'ai pas coché, car je me demande pourquoi la premiere solution ne passe pas et la deuxieme oui????????
    Salut,

    car ce ne sont pas les memes methodes !

    La notion d'invoke est differente suivant de quoi on parle. Invoker un délégué, c'est appelé les fonctions de ce délégué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delegue.Invoke([...]); // = delegue([...])
    Quant à l'invoke sur un controle, c'est une implementation de l'interface ISynchronizeInvoke ( ns : ComponentModel) qui te permet de marshaller l'appel d'un délégué dans un autre thread.

    Ici quand tu appelé MonDelegué.Invoke(), tu ne faisais que levé ton délégué sans changer de Thread. Le fait d'enlever Mondelegué (et donc implicitement de faire this.Invoke this etant un derivé de Control) appelle à ce moment la la bonne methode.

    Bref, ce sont deux methodes totalement differentes, c'est ca le point important à retenir. =)

  9. #9
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut
    bien a toi aussi SirJulio.

    C'est encore plus clair. Je vais rechercher de mon côté, puisque je faisais comme ca depuis le début et ca ne me levais pas d'erreur inter-thread.

    Bien cordialement,

    Léo V.V.

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

Discussions similaires

  1. Utilisation du port serie TQCcom32
    Par yann87 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 25/09/2008, 14h32
  2. Utilisation des ports (serie, usb, etc.)
    Par muslim1987 dans le forum C++
    Réponses: 2
    Dernier message: 08/07/2008, 13h57
  3. utilisation du port serie COM1
    Par Pol63 dans le forum VB.NET
    Réponses: 9
    Dernier message: 07/04/2008, 15h21
  4. Réponses: 6
    Dernier message: 04/10/2006, 18h40
  5. Utilisation du port serie
    Par barucca dans le forum Matériel
    Réponses: 5
    Dernier message: 15/04/2004, 16h20

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