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 :

invalid Operation Exception


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut invalid Operation Exception
    Bonjour

    je tente d'écrire dans un textbox un caractère reçu par une liaison série
    et la mise a jour du textbox me met cette erreur.
    Je ne comprend rien à la notion de thread et encore moins d'accès thread safe dont parle l'aide.

    Les solutions proposées avec 50 lignes de code me paissent trop démesurées avec une simple écriture dans une zone de texte pour être adaptées a ce que je fais...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                    int data = serialPort1.ReadChar();
                    textBox1.Text += data.ToString();
            }
    Pouvez vous m'expliquer mon erreur svp

    Merci par avance

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    il faudrait savoir sur quelle ligne ca plante, et tu faire du pas à pas pour comprendre ce qui plante
    parce que c'est surement la lecture sur le serialport qui plante

    sur une application on peut avoir plusieurs threads, chaque thread s'exécutant simultanément
    ca permet de gagner en performance sur certains traitement ou de ne pas bloquer l'interface

    le terme thread safe utilisé dans msdn signifie qu'une classe ou un membre ne pose pas de soucis à être utilisé par plusieurs threads en même temps
    par exemple sur un list<T> on peut avoir des problème, si un thread fait un for each sur la collection et qu'un autre thread fait .Add ca va planter dans le for each car la collection n'est plus la même
    m'enfin je ne pense pas que ton problème vient d'un thread, du moins avec le code que tu nous montres
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    Bonjour

    ca plante sur TextBox1.Text...

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

    Je mets ci dessous tout le code de mon appli, elle est tres simple pour le moment, facile de s'y retrouver.

    1 bouton qui envoi un caractère par la liaison série
    L'appareil branché en face renvoi un caractère e retour
    Mon appli doit afficher dans le textebox1 ce qu'elle reçoit

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
            }
     
            private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                    int data = serialPort1.ReadChar();
                    textBox1.Text += data.ToString();   //c'est ici que ca merdoit
            }
     
            private void Form1_Activated(object sender, EventArgs e)
            {
                serialPort1.Open();
            }
     
            private void Form1_Deactivate(object sender, EventArgs e)
            {
                serialPort1.Close();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                // Makes sure serial port is open before trying to write
                try
                {
                    if (!(serialPort1.IsOpen))
                        serialPort1.Open();
                    serialPort1.Write("a");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Erreur ouverture port serie :: " + ex.Message, "Error!");
                } 
            }
        }
    }
    Merci

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    ah ok

    l'évènement DataReceived est déclenché sur un thread secondaire
    et seul le thread principal a le droit d'accéder aux controles

    pour contourner ce soucis, il faut repasser sur le thread principal via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.invoke(le délégué qui pointe vers un void qui lui s'occupera de modifier le textbox)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Les évènements de la classe SerialPort se produisent sur un thread secondaire, pas sur celui de l'UI. Or, seul le thread de l'UI peut accéder aux éléments de l'UI. Il faut donc utiliser la méthode Invoke pour faire la mise à jour de la TextBox sur le thread de l'UI :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                int data = serialPort1.ReadChar();
                Invoke(AppendReceivedText, data.ToString());
            }
     
            private void AppendReceivedText(string text)
            {
                textBox1.Text += text;
            }

  6. #6
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    Merci, j'ai pigé le problème des threads.

    Je dois par contre avoir un problème de déclaration maintenant
    faut il déclarer la méthode AppendReceivedText quelquepart ?

    Le compilo me dit que les arguments du Invoke ne sont pas bons

    Erreur 1 La méthode surchargée correspondant le mieux à 'System.Windows.Forms.Control.Invoke(System.Delegate, params object[])' possède des arguments non valides
    Erreur 2 Argument '1'*: impossible de convertir de 'groupe de méthodes' en 'System.Delegate'
    Erreur 3 Argument '2'*: impossible de convertir de 'string' en 'object[]'

  7. #7
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    ca y est j'ai réussi

    avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                    int data = serialPort1.ReadChar();
                    textBox1.Invoke(new TextBoxInvokeHandler(FonctionTextBox),data.ToString());
            }
     
            private delegate void TextBoxInvokeHandler(string text);
     
            private void FonctionTextBox(string text)
            {
                textBox1.Text += text;
            }
    Merci beaucoup !

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par petitours Voir le message
    Le compilo me dit que les arguments du Invoke ne sont pas bons
    Ah oui pardon... Plutôt que de créer un delegate spécifique, tu peux utiliser Action<string> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textBox1.Invoke(new Action<string>(FonctionTextBox),data.ToString());

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

Discussions similaires

  1. [Débutant] Exception system.invalid.operation exception levé
    Par sarrabnh dans le forum ASP.NET MVC
    Réponses: 1
    Dernier message: 09/05/2013, 16h04
  2. [Débutant] Invalid Operation Exception
    Par Shindaraa dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 14/08/2012, 14h37
  3. probleme de invalid parametre exception
    Par Asmod_D dans le forum C++
    Réponses: 12
    Dernier message: 09/04/2009, 17h05
  4. Réponses: 1
    Dernier message: 22/10/2008, 11h29
  5. [JDBC]Invalid Operation : Type de ResultSet
    Par zizou771 dans le forum JDBC
    Réponses: 7
    Dernier message: 10/10/2005, 11h56

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