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 :

Passer un argument malgrès AddressOf ?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 66
    Par défaut Passer un argument malgrès AddressOf ?
    Bonjour,

    J'utilise actuellement AddressOf pour rappeller une fonction a laquelle je souhaiterai passer une classe.
    Or AddressOf ne permet pas de passer de paramètres a une fonction alors comment est ce que je pourrais procéder ?

    J'ai pensé a mettre en variable globale ma classe pour que les deux fonctions y est accés mais cette solution est quand même relativement sale..

    Toutes les propositions sont les bienvenues !

    Merci d'avance et bonne journée !

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    addressof et paramètre je ne vois pas forcément le soucis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim f as new func(of string, boolean) (addressof(mafonction))
    dim b as boolean = f.invoke("unstring")
    précise ta question avec du code je pense ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 66
    Par défaut
    Voila :

    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
     
    Private Sub ReceptionDoneeClient(ByVal asyncResult As IAsyncResult)
            Dim socketClient As Socket = CType(asyncResult.AsyncState, Socket)
            Try
                Dim Read As Integer = socketClient.EndReceive(asyncResult)
                If Read > 0 Then
                    Dim thServer = New ThServer(_form, "setId")
     
                    thServer.Parser.Parse(msg)
                    MessageBox.Show(thServer.Parser.getSetMsgReturn)
                    MessageBox.Show(thServer.getSetError())
                    thServer.PrintText(msg)
     
                    RaiseEvent ClientMessage(socketClient, msg, EventArgs.Empty) 
                    socketClient.BeginReceive(rBuf, 0, rBuf.Length, SocketFlags.None, AddressOf ReceptionDoneeClient, socketClient) 'Ici je souhaiterais passer ma classe thServer en paramètre
                ElseIf Read = 0 Then 
                    _nombreClients -= 1
                    Dim myEventsArgs As New MyEventArgs
                    myEventsArgs.MyArgs = "-"
                    RaiseEvent ClientAccepteOrDeco(socketClient, myEventsArgs) 
                End If
            Catch ex As ObjectDisposedException
                MessageBox.Show("Client déconnecté !")
            Catch ex As SocketException
                MessageBox.Show("SocketException")
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    (Je suis nouveau en vb net donc il est possible que j'ai fais des erreurs bêtes et méchantes !)

    Merci de te pencher sur le sujet

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    beginreceive est une méthode asynchrone qui demande un callback (fournit via l'adressof)
    la signature de la méthode (=paramètres en nombre et en type) doit être du type voulu par le callback, ca ne peut pas être modifié

    parcontre si ma mémoire est bonne le dernier paramètre à fournir à cette méthode c'est ce qu'on veut, et ce qu'on veut pouvoir retrouver dans le callback justement
    au lieu de passer socketClient vous pourriez donc donner votre thread
    asyncResult.AsyncState contiendra alors le thread et plus le socket ce qui vous embêter aussi

    il faut alors trouver un moyen de retrouver le thread, le mettre en variable privée n'est pas une mauvaise idée
    si vous avez plusieurs sockets et plusieurs threads, vous pouvez utiliser un dictionary(of socket, thread), qui fera la "liaison"
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 66
    Par défaut
    Tout d'abord merci pour ces explications détaillées !
    L'idée de passer le thread n'est pas bête du tout mais pour être honnête cette idée n'est pas super claire a mes yeux car le thread est déclaré plus haut et comment l'utiliser simplement ensuite ?
    En revanche il serait peut être possible de passer une structure ou une classe contenant socketclient et thServer (ma classe) dedans et de les utiliser comme ça ?

    Je vais me documenter sur le dictionnaire de threads !

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    Citation Envoyé par taspai Voir le message
    Tout d'abord merci pour ces explications détaillées !
    L'idée de passer le thread n'est pas bête du tout mais pour être honnête cette idée n'est pas super claire a mes yeux car le thread est déclaré plus haut et comment l'utiliser simplement ensuite ?
    En revanche il serait peut être possible de passer une structure ou une classe contenant socketclient et thServer (ma classe) dedans et de les utiliser comme ça ?

    Je vais me documenter sur le dictionnaire de threads !
    que je le thread soit déclaré ici ou ailleurs, tant que vous avez une référence (= une variable qui pointe vers l'instance) vous pouvez le manipuler
    sinon une classe avec des propriétés (socket, thread et autre éventuellement) est en effet la bonne idée

    le principe du dictionary c'est comme de tout dictionnaire de lier une clé à une définition
    si vous avez plusieurs sockets (et donc plusieurs threads) vous aurez plusieurs instance de la classe en question, et vous serez surement amené à vous poser la question comment je retrouve la bonne dans la collection (car le dictionary est une collection)

    exemple générique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dim _dico as new dictionary(of string, long)
    _dico.add("un id",5)
    _dico.add("un autre string",9)
    _dico("un autre string") = 8 ' changement de 9 vers 8
    _dico.remove("un id")
    et donc avec les bons types on peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dico.add(monsocketactuel, maclasseQuiContientSocketEtThread)
    ce qui fait qu'à un instant T quand vous recevez des octets du sockets vous pouvez écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim monInstanceDeClasse = dico(socketactuel)
    monInstanceDeClasse.tellePorpriété = telleValeur

    après il est aussi possible de faire un classe plus complexe (dans la structure pas dans le code ni dans l'utilisation) qui s'occupe de démarrer le thread et de le gérer, et aussi de gérer tout le socket
    ainsi vous aurez du code simple avec toutes les variables nécessaires sous la main
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Comment passer des argument a un script php ?
    Par Florina dans le forum Linux
    Réponses: 2
    Dernier message: 11/12/2005, 14h38
  2. Awk - Passer un argument ?
    Par init dans le forum Linux
    Réponses: 6
    Dernier message: 19/10/2005, 12h56
  3. Comment passer les arguments à un script perl
    Par belgampaul dans le forum Langage
    Réponses: 4
    Dernier message: 06/08/2005, 12h52
  4. Réponses: 8
    Dernier message: 30/05/2005, 13h55
  5. [Struts] Passer un argument dans un property
    Par Malaussene dans le forum Struts 1
    Réponses: 4
    Dernier message: 07/09/2004, 10h11

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