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

VB.NET Discussion :

Threads invoke or begininvoke cannot be called on a control until the window handle has been created


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 66
    Points : 45
    Points
    45
    Par défaut Threads invoke or begininvoke cannot be called on a control until the window handle has been created
    Bonjour,

    J'utilise des threads sans soucis dans mon programme mais j'ai tout dans le Form1.vb et donc j'organise mon code de manière différente pour des raisons de compréhensions.

    Donc j'ai créé un fichier dans lequel j'ai mis mon code par rapport aux threads et donc au lieux de faire Me.Invoke(Sub() Me.Label1... je fais Form1.Invoke(Sub() Form1.Label1...

    Mais je me retrouve face a ce message d'erreur lors de l'éxecution des threads : "invoke or begininvoke cannot be called on a control until the window handle has been created"
    Je ne comprends pas ce qu'il se passe car je fais bien référence a Form1 donc cela revient au même ..

    Merci d'avance et bonne journée !

  2. #2
    Membre confirmé Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Points : 580
    Points
    580
    Par défaut
    Ta Form1 est bien instancié et référencé ?
    Tu peux mettre un extrait de code aussi ?
    " Je préfère comprendre les gens qui ne me comprennent pas "

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    quand un control doit devenir visible pour la 1ère fois, une méthode est appelée pour créer le handle dans windows (c'est windows qui gère les controles)
    tant que ce n'est pas arrivé on a pas l'air de pouvoir faire d'invoke dessus

    il y a des solutions propres mais si tu veux faire simple tu peux tenter d'écrire me.createcontrol dans le sub new du form

    sinon lancer les threads plus tard, genre sur l'event load du form
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    Il y a beaucoup de code alors en mettre vas etre un peu dur mais ma form est bien instancié oui, référencé je ne sais pas ce que c'est..

    En gros mon programme est un serveur multiclients et donc quand un client se connecte cela créé un thread afin de le gérer donc les threads se lancent tard (la fenetre est affiché et attend les connections..)

    Exemple :

    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
     
    Sub MiseAJourMsgClient(ByVal sender As Object, ByVal Msg As String, ByVal e As EventArgs)
            Dim thServer As New ThServer
            Dim SocketClient As Socket = CType(sender, Socket)
     
            thServer.Parser.Parse(Msg)
     
            Me.Invoke(Sub() Me.ListBoxDetails.Items.Add("Message de " & SocketClient.RemoteEndPoint.ToString() & " : " & Msg))
            Dim LI() As String = Split(Msg, "¤")
            If LI(1) = "operation" Then
                SocketClient.Send(System.Text.Encoding.Unicode.GetBytes("Datas received"))
                Me.Invoke(Sub() Me.ListBoxDetails.Items.Add("Operation d'un client"))
                Console.WriteLine("Socket send message for operation")
            End If
     
            If LI(1) = "connexion" Then
                Console.WriteLine("Connexion client")
                Me.Invoke(Sub() Me.ListBoxDetails.Items.Add("Connexion d'un client"))
            End If
            If LI(1) = "deconnexion" Then
                Console.WriteLine("Déconnexion client")
                Me.Invoke(Sub() Me.ListBoxDetails.Items.Add("Deconnexion d'un client"))
            End If
        End Sub
    Merci pour votre aide

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    J'ai continué de travailler dessus et donc au final ce qui se passe c'est que j'ai mon MainForm qui lance une classe et cette classe lance une classe (appellé thServer) en thread x fois.

    Ce que je souhaite c'est pourvoir modifier l'interface depuis une fonction étant dans thServer, j'ai donc essayé de faire de deux manières :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     MainForm.Invoke(Sub() MainForm.ListBox5.Items.Add(str))
     MainForm.ListBox1.Items.Add(str)
    J'admet que j'ai essayé un peu a taton le résultat est le suivant :

    Première méthode j'obtiens le fameux message d'erreur : "Threads invoke or begininvoke cannot be called on a control until the window handle has been created"
    Et de la deuxième je n'ai aucun message d'erreur mais il ne se passe absolument rien sur l'interface (car je ne dois pas etre sur le bon thread..)

    J'espère m'être exprimé a peu près clairement, merci d'avance pour votre aide et bonne soirée !

  6. #6
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    pour avoir le droit d'ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      Form1.Invoke() 
      'ou
     'Form1.BeginInvoke()
    Il faudrait que Invoke et BeginInvoke soit des methodes statiques(shared) ce qu'elles ne sont pas....
    Comme elles sont des methodes d'instance elle exigent une reference à ton form(me)...

    Conseil :dans ton appel tu peux transmettre une reference à ton form actuel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Sub MiseAJourMsgClient(ByVal sender As Object, ByVal Msg As String, ByVal e As EventArgs,byval frm as TonForm)
    end sub
    bon code....

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    Entendu, merci beaucoup je vais essayer ca et je je tiens au courrant

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par MABROUKI Voir le message
    bonjour
    pour avoir le droit d'ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      Form1.Invoke() 
      'ou
     'Form1.BeginInvoke()
    Il faudrait que Invoke et BeginInvoke soit des methodes statiques(shared) ce qu'elles ne sont pas....
    Comme elles sont des methodes d'instance elle exigent une reference à ton form(me)...
    en vb.net on peut écrire ca, vb créé des variables shared pour les forms avec le nom de la classe
    ca permet aux débutants d'écrire form2.textbox1.text = "", soit ce qu'il y a de plus affreux en terme de design ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    J'ai donc ajouté dans mes deux classes public _form as new MainForm et je me sers de _form.Invoke et ça fonctionne très bien !

    Merci beaucoup et bonne journée !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/10/2010, 17h10
  2. Classe JDialog + cannot reference parent before supertype constructor has been called
    Par une_tite_question dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 08/04/2008, 15h51
  3. Windows et Multi-Threading - Invoke
    Par zi_omnislasher dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 26/10/2007, 17h20
  4. Windows et Multi-Threading - Invoke
    Par zi_omnislasher dans le forum Windows
    Réponses: 1
    Dernier message: 26/10/2007, 10h13
  5. [C#][Thread][Invoke] petit problème de delegate
    Par clinic dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 22/06/2007, 11h38

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