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 :

[VB.NET]Erreur "invalid cross-thread operation"


Sujet :

Windows Forms

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut [VB.NET]Erreur "invalid cross-thread operation"
    Bonjour à tous,
    J'utilise un controle SerialPort. Lorsque je recois des informations de la machine reliée à mon port série, il y un un traitement qui se fait mais tout se passe en arrière plan.
    Je voulais, lorsque le traitement était terminé, afficher une dialog pour laisser un choix d'opérations à l'utilisateur.
    J'avais pour celà utilisé un Event dont j'avais défini un handler sur ma fenêtre principale (Si j'avais directement appelé le handler, j'aurais surement eu le mm résultat)
    Mais lorsque le Handler est appelé, j'ai une erreur "invalid cross-thread operation"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     ' Evenement qui se produit lorsque la communication et le traitement sont terminés
        Public Sub TxEndedHandler()
            dlgRefresh.ShowDialog(Me) ' <-- erreur ici
            dlgRefresh.Dispose()
        End Sub
    Je pense que l'erreur vient du fait que j'utilise le Me dans un thread qui n'est pas le mm que celui qui a créé la fenetre (je suis toujours dans le thread créé implicitement pour la réception) mais je ne sais pas du tout comment m'y prendre pour ne pas utiliser le Me. Sans doute devrais-je utiliser des synchronisations inter-thread ou qqe chose dans le style mais je ne sais vraiment pas.

    Pourriez-vous'orienter?

    Merci d'avance,
    Nicolas

  2. #2
    Membre habitué Avatar de del-dongo
    Inscrit en
    Mai 2003
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 147
    Points : 183
    Points
    183
    Par défaut
    tu es en fx 2.0..? parce que par défaut les controls managés lèvent une exception lorsque l'une de leur méthode est invoquée dans un thread qui n'est pas celui qui les a créées.
    Tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Control.CheckForIllegalCrossThreadCalls = false;
    pour éviter ce genre de probleme. Mais le mieux étant évidemment d'utiliser les ...Invove sur ces controls...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Oui je suis bien en 2.0.
    Je préfère ne pas désactiver l'exception mais plutot l'empecher
    Qu'est ce que sont les Invove (invoke p-e?)?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Désolé d'insister mais ça me fait une vilaine erreur et je ne sais pas comment la corriger.

    Pour reformuler ma question :
    Comment faire lorsque l'on a 2 threads pour qu'un thread (celui qui tourne en arrière plan) dise à l'autre(celui qui gère ma fenêtre) d'effectuer une opération?

    Merci d'avance,
    Nicolas

  5. #5
    Membre habitué Avatar de del-dongo
    Inscrit en
    Mai 2003
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 147
    Points : 183
    Points
    183
    Par défaut
    3 méthodes vont être utiles pour résoudre ton problème
    Control.Invoke(delegate, object[]) dans le cadre d’une délégation synchrone et le couple Control.BeginInvoke(delegate,object[]) et Control.EndInvoke(IAsyncResult) dans le cadre d’une délégation asynchrone

    Les méthodes de type "...Invoke" parcourent le pool de thread de facon à retrouver celui qui possèdent le handle du control que tu veux adresser (donc plus d'erreur de cross threadoperation).

    Maintenant il te reste à savoir si l'appel de ces méthodes doit être bloquant ou pas. Dans ton cas tu fais de toute facon appel à un showdialog sur une form donc un un simple Invoke suffira.

    le code devrait ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private Sub ShowTxDlg()
         dlgRefresh.ShowDialog(Me)
    End Sub
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Sub TxEndedHandler()
         Me.Invoke(ShowTxDlg)
    End Sub

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Merci beaucoup pour tes explications Avec ça je devrais m'en sortir
    Je vais tester directement

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Heu en fait j'ai quelques lacunes avec les delegates. Comment dois-je déclarer ma fonction pour que le code soit accepté?

    EDIT :
    J'ai trouvé mais je ne suis pas certain d'avoir utilisé la bonne méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Delegate Sub fctShow()
     
        Private Sub ShowRefreshDlg()
            dlgRefresh.ShowDialog(Me)
            dlgRefresh.Dispose()
        End Sub
     
        ' Evenement qui se produit lorsque les pièces ont été envoyée à la CNC
        Public Sub TxEndedHandler()
            ' Appeler un showdialog avec le thread qui gère la fenetre (ici on se trouve logiquement dans le thread qui sert à la reception des données sur le port COM)
            Me.Invoke(New fctShow(AddressOf ShowRefreshDlg))
        End Sub

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/03/2013, 19h16
  2. [WP 7.1 beta 2] Message d'erreur Invalid cross-thread access
    Par Immobilis dans le forum Windows Phone
    Réponses: 3
    Dernier message: 28/07/2011, 17h21
  3. [C#]Cross-thread operation not valid
    Par hrp dans le forum Windows Forms
    Réponses: 17
    Dernier message: 31/07/2007, 16h36
  4. Cross-thread operation not valid && serialport
    Par vince_lille dans le forum Windows Forms
    Réponses: 4
    Dernier message: 20/04/2007, 11h57
  5. [VB.NET 2.0] Cross-Thread Exception
    Par guillaume1998 dans le forum Windows Forms
    Réponses: 13
    Dernier message: 30/01/2006, 18h16

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