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] Création MDIChild dans un thread différent


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut [VB.NET] Création MDIChild dans un thread différent
    Bonjour,

    J'explique le systeme :

    Je tir avec un pistolet hardware et celui ci me renvoi un spectre via le port Serie , ce meme port , quand il recoit un spectre , leve un evenement

    J'ai une MainForm qui est MDIContainer

    Je veux qu à chaque tir effectué , une nouvelle fenetre SpectreForm soit créée

    dans ma MainformLoad je crée un evenement :

    AddHandler Communication.tir_stoped, AddressOf communication_tir_stoped

    qui informe que la transmission de donnée est finie


    PrivateSub communication_tir_stoped()
    System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
    'MsgBox("Fin du Tir")
    Dim res As DialogResult
    res = MessageBox.Show("Voulez vous garder ce spectre ?", "Capture", _
    MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)
    If res = DialogResult.Yes Then
    MDIFilleActive = New SpectreForm
    MDIFilleActive.MdiParent =
    Me
    MDIFilleActive.Spectre_Brut = DP4DataTampon

    MDIFilleActive.Show()
    MDIFilleActive.Affiche(
    Nothing, Nothing)
    ElseIf res = DialogResult.No Then
    Panel18.Visible = False
    EndIf
    EndSub

    J'obtiens l'erreur suivante :

    MDIFilleActive.MdiParent = Me

    Une exception non gérée du type 'System.ArgumentException' s'est produite dans system.windows.forms.dll
    Informations supplémentaires : Les contrôles créés sur un thread ne peuvent pas être parents d'un contrôle d'un autre thread.


    J'ai l'impression que le declenchement de l'evenement crée un nouveau thread et que le "Me" ne fait plus référence à la MainForm

    Est ce que quelqu'un saurait régler ce probleme de MDIParent ?

    J'espere avoir expliquer le plus clairement et plus brevement possible

    merci

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 238
    Points : 269
    Points
    269
    Par défaut
    Il est possible que le Me ne fasse plus réference à ta main Form mais au Thread dans lequel la fonction tourne.

    Tu devrais essayer de déclaré ta main Form en variable Globale et de l'autoassigné dans le constructeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MainForm MaFormParent;
     
    //Dans le constructeur
    MaFormParent = Me;
    Sinon d'un point de vu Structure je préfère mettre les traitement de mes Thread dans des classes différentes (histoire de lisibilité)
    Si tu décide de faire ca fait la même chose en référencant ta MainForm dans le constructeur de ton nouvel Objet, avant de lancé ton Thread.

    Une fois que tu as bien référencé ta MainForm tu devrais pouvoir assigné a ta nouvelle Form son parent.

    SI je me suis mal exprimé fait moi signe !
    « L’erreur est humaine, mais un vrai désastre nécessite un ordinateur »

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    merci bilou pour les conseil , tkt ta été clair ^^;

    J'ai toujours la meme erreur...

    Et en fait je sais meme pas si c'est un autre Thread , je sais juste que cette création de Fenetre fille se fait a l'interieur d'une procedure déclenchée par un evenement d'une autre classe

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 238
    Points : 269
    Points
    269
    Par défaut
    Normalement si tu as bien passé la référence de ta fenetre Mere MDIContainer entre toutes tes Form, tu devrais pouvoir faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     MDIFilleActive.MdiParent = LaFenetreMdiMere
    Pour la question du thread, si tu ne précise pas que tu créer un nouveau Thread ou que tu utilise un BackGroundWorker, ton appli reste sur un seul Thread.
    « L’erreur est humaine, mais un vrai désastre nécessite un ordinateur »

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    L'erreur que tu as est tout a fait normal c'est a fin d'eviter que n'importe quel fil d'execution puisse modifier ton interface, il existe une proprieté qui te permet de modifier ton interface selon n'importe quel thread mais c'est assez "risqué".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CheckForIllegalCrossThreadCalls = false
    Mais le mieux est quand même de modifier ton interface a partir du thread principal. et pour ça il faut que tu envoie des paramètre a ton thread tien jetes y un oeuil :BackGroundWorker
    1 || 1 = 1
    1 && 1 = 1
    1 * 1 = 1
    Bon après tout, peut-être que Van Damme avait raison :
    1 + 1 = 1 // harmonie parfaite

  6. #6
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    hmm j'avais pas Backgroundworker , j'ai installer le framework 2.0 mais mon visual studio 2003 est toujours sous le framework 1.1

Discussions similaires

  1. Comment charger un fichier dans un thread différent
    Par leenox dans le forum Android
    Réponses: 4
    Dernier message: 25/02/2013, 15h54
  2. Réponses: 3
    Dernier message: 12/04/2011, 15h16
  3. [WD10] Gestion d'un fenêtre dans un thread différent
    Par Louis Griffont dans le forum WinDev
    Réponses: 23
    Dernier message: 21/06/2010, 09h47
  4. [C#][2.0] Sauvegarde d'un DataSet dans des threads différents
    Par Pilloutou dans le forum Framework .NET
    Réponses: 9
    Dernier message: 23/04/2007, 14h17
  5. [VB.NET] création d'une table dans une base access
    Par smedini dans le forum Accès aux données
    Réponses: 1
    Dernier message: 31/12/2005, 11h53

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