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 :

PB invoke pour socket asynchrone


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 18
    Par défaut PB invoke pour socket asynchrone
    Bonjour,


    je travaille actuellement sur une application client/serveur faisant appel aux socket en mode asynchrone.
    concernant les sockets, ca devrait aller. la ou je peche c'est avec le "invoke".

    cote du socket serveur, je le connecte avec "Bind" et "Listen" puis je le met en attente d'une connection client avec "BeginAccept". la fin de la connection client se fait dans un autre thread avec "EndAccept", a ce momment la j'aimerais mettre a jour un textbox sur ma fenetre principale. cette fonction s'executant dans un autre thread je ne peux pas le faire directement.
    je dois donc utiliser le "invoke". mais au moment ou je l'appel j'ai l'erreur 'Impossible d'appeler Invoke ou BeginInvoke sur un contrôle tant que le handle de fenêtre n'a pas été créé.'.

    mon code est le suivant :
    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
     
    Public Sock_SERVEURlisten As Socket
    Public Sock_SERVEURclient As Socket
    Delegate Function SERVEUR_AddConnection_delegate()
    Public SERVEUR_AddConnection As SERVEUR_AddConnection_delegate = AddressOf SERVEUR_AddConnection_src
     
        Function SERVEUR_Connection(ByVal AdresseIP As String, ByVal Port As Integer)
     
            Dim SERVEUR_ep As IPEndPoint
     
            Sock_SERVEURlisten = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            SERVEUR_ep = New IPEndPoint(IPAddress.Parse(AdresseIP), Port)
     
            Sock_SERVEURlisten.Bind(SERVEUR_ep)
     
     
            Sock_SERVEURlisten.Listen(1)
     
            Sock_SERVEURlisten.BeginAccept(AddressOf SERVEUR_NouvelleConnection, Sock_SERVEURlisten)
     
            Form1.txt_serveur.Text = Form1.txt_serveur.Text & "SERVEUR en attente de connection sur " & AdresseIP & " : " & Port & vbCrLf
     
        End Function
     
        Function SERVEUR_NouvelleConnection(ByVal asyncResult As IAsyncResult)
     
            Sock_SERVEURclient = Sock_SERVEURlisten.EndAccept(asyncResult)
            Form1.txt_serveur.Invoke(SERVEUR_AddConnection, Nothing)
     
        End Function
     
        Function SERVEUR_AddConnection_src()
     
            Form1.txt_serveur.Text = Form1.txt_serveur.Text & "Nouvelle connection" & vbCrLf
     
        End Function
    l'erreur se produit sur la ligne ou j'appelle la fonction "invoke"



    voila, si quelqu'un peut m'aider, c'est la 1ere fois que je suis confronter aux probleme de multi-thread...

  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 faut initialiser ton socket un peu plus tard, tant que le controle n'est pas affiché (en gros) tu ne peux pas faire d'invoke dessus
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 18
    Par défaut
    Si si le controle est afficher, c'est depuis ma 'Form1' que, via des boutons, j'appelle mes fonctions de connection des socket ...
    la fenetre et donc le textbox en question est visible a l'ecran au moment de l'erreur.

  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
    ok
    en fait c'est que ta fonction est dans une classe ou un module à part
    et écrire form1.quelque chose bien que toléré par le compilateur est une source de problème (preuve en est une fois de plus)

    vb.net créé une variable publique avec le nom de chaque form de ton projet
    ca a été prévu pour les débutants mais ce n'est pas logique (rien que le fait qu'à un instant T on peut avoir 2 fenetres du même type ouvertes, la variable est alors caduque)

    dans ton cas ceci génère une nouvelle instance du form, et cette instance par contre n'est pas affichée (d'où le plantage)

    en temps normal on (=les intervenants de ce forum) précise qu'il alors avoir une variable privée de type form1, remplie par l'appelant qui passera Me

    mais dans ton cas tu as réussi à isoler le code du socket, donc avoir une référence sur un form n'est pas logique, le mieux est alors que tu fasses un event, et que form1 s'abonne à cet event
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 18
    Par défaut
    en effet, j'ai mis toutes les fonctions lié aux sockets dans un module distinct du reste.
    et donc je ne peux pas utiliser le mot-cle "Me" ...

    comment puis je faire pour faire le event dont tu me parle?


    Merci

  6. #6
    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
    public event monevent (parametres)

    puis à la place de setter le textbox tu fais Raisevent monevent

    et le form s'abonne (via addhandler par exemple)

    au passage le mieux serait de remplacer module par class, sinon c'est un event shared
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. Erreur Socket Asynchrone 10053
    Par QAYS dans le forum Delphi
    Réponses: 2
    Dernier message: 16/06/2006, 07h44
  2. code c pour sockets (udp vers tcp et inversement)
    Par HiT dans le forum Développement
    Réponses: 11
    Dernier message: 19/11/2005, 18h03
  3. connexion socket asynchrone
    Par jagboys dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/06/2005, 17h04
  4. [SOAP] API pour appels asynchrones
    Par Dar Shak dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 26/04/2005, 08h57
  5. [C#] [Sockets] Eclaircissements pour connexions asynchrones
    Par Sinclair dans le forum Windows Forms
    Réponses: 6
    Dernier message: 08/06/2004, 17h50

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