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 :

Cross-thread operation not valid && serialport


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 49
    Points : 50
    Points
    50
    Par défaut Cross-thread operation not valid && serialport
    Bonjour,

    J'ai commencé le dev en .NET et C# il y a 1 semaine à peine.

    Je suis face à unprobleme est classique, mais dans un contexte different.

    J'ai une frmMain qui contient une FrmTerminal : cette frmTerminal gere la liaison RS232 avec un microcontrolleur.

    D'un point de vue conceptuel, la gestion de la communication RS est reservé à frmTerminal, tandis que frmMain ne fait que demander un envoi de donnees / recevoir des données.

    On se retrouve donc dans le cas classique d'echange de données entre 2 applis : une solution est donnée par exemple ici http://faqcsharp.developpez.com/?page=form#form_meth .
    On peut encore utiliser les delegate et invoke.

    test basique
    Si je gere l'echange via un bouton classique, pas de probleme.
    delegate, invoke, .... trop facile

    automatisation
    Pour automatiser la communication, je decide d'utiliser l'evenement OnDataReceived du composant serialport (frmTerminal).
    Je lui demande donc l'execution de ma methode de traitement précédente, qui fonctionne, et ....
    Cross-thread operation not valid

    Je ne comprend pas d'ou provient la difference entre le cas basique fonctionnel et l'automatisation qui plante.
    Quel est l'impact du composant serialport et de l'event OnDataReceived.

    Merci de votre aide.

    Vincent

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    Normal que le cross thread hurle

    L'event est géré dans un thread à part.. donc, le code mis dans le OnDataReceived, c'est comme si tu m'étais ce code dans un OnTimerElapsed, c'est dans un thread différent du thread principal

    Pour y remedier, je fais souvent appel à la propriété :

    CheckForIllegalCrossThreadCalls = false;

    C'est pas le "plus" joli mais ca a le mérite de marcher de suite

    The Monz, Toulouse

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    bonsoir
    et merci de ta reponse
    juste une precision : ou faut il mettre ce pas joli
    CheckForIllegalCrossThreadCalls = false;

    je dirais dans ma form principale; avant de la lancer par le run application
    merci

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Points : 89
    Points
    89
    Par défaut
    Ou alors (parce que t'es pas obligé d'être un bourrin, hein ), tu utilises la méthode Invoke d'un delegate de la fonction que tu veux appelée. C'est la méthode "classique".

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    Merci hobotalker,

    J'ai bien tenter le delegate mais ca fonctionne pas.
    voici le cablage que j'effectue

    ma form principale : frmmain
    j'ai la fonction MyUpdate qui gere mes datas -> celle que je veux appeller

    public void MyUpdate(string data)
    {
    RichTextBox1.Append(data)
    }

    ma forme secondaire : frmTerminal
    elle est contenu dans frmMain.
    pour la rendre accessible, je vous avec la propiete Owner.

    public delegate void MonProtoDelegue (string fonction);

    private ......OnDataReceived
    {
    MonProtoDelegue MonDelegue = new MonProtoDelegue( ( (frmMain)(this.Owner) ).MyUpdate);
    MonDelegue .Invoke("ededededede");
    }

    Est ce que ce code est bien correct ?
    normalement oui, c'est celui qui fonctionne avec mon test de base qui échange les datas entre Combobox contenu dans mes deux form.

    J'ai aussi fait le test en ajoutant un TImer dans frmTerminal, et en cablant l'appel de MonDelegue sur le OnTick : ca fonctionne tres bien.

    Le probleme pourrait il venir du mon composant SerialPort ?

    Merci

+ 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. [C#]Cross-thread operation not valid
    Par hrp dans le forum Windows Forms
    Réponses: 17
    Dernier message: 31/07/2007, 16h36
  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