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

  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 204
    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 204
    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 204
    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 204
    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 204
    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 204
    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

  7. #7
    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
    Alors actuellement je suis en train de mettre en place une structure contenant ce dont j'ai besoin dans l'idée de la passer en paramètre et donc a la question comment trouver la bonne instance je répond il n'y a pas besoin de la trouver car en passant la structure en paramètre il aura directement la bonne.

    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
    C'est ce que je suis en train de faire par rapport a l'organisation de mes classes il me semble mais je ne suis pas sur, pouvez vous détailler un peu plus votre idée pour voir si c'est bien ce a quoi je pense ?

    Encore merci pour vos réponses bien détaillés, c'est un régal a lire !

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    il faudrait plus de code ou de détails
    et surtout où se trouve la sub que vous nous avez montré
    si elle est sur un form, il faudrait la déplacer dans la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class client
      private _socket ...
      private _thread ...
     
      ' + toutes les propriétés que vous aurez besoin pour travailler
     
      ' + éventuellement des propriétés nécessaire à l'affichage d'infos sur un form (statut de ce client etc...)
     
      ' + des events genre ClientDisconnected
     
      private sub receive ... ' donc gestion du socket dans cette classe
    dans l'idéal une classe de traitement ne doit pas modifier l'interface graphique (ni faire des messagebox)
    elle doit avoir des propriétés et des méthodes qui sont utilisées par l'interface graphique
    soit depuis un timer, soit sinon faire des events (public event machin ... + raisevent)
    (et donc un bouton appelle une méthode sur une instance, comme ca le code n'est pas en fouilli sur le form)
    par contre les events seront levés sur le thread d'exécution en cours, et l'interface ne peut etre modifiée que depuis le thread principal, mais il y a des moyens de corriger ca aussi
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    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
    Mon code est un peu en bazard donc je ne peux pas vraiment tout mettre, la sub que je vous ai montré est dans ma classe principale qui gère le serveur par rapport aux connexions des multiples clients.
    Ensuite j'ai ma classe ThServer (que je voulais passer en paramètre) qui contient une classe pour s'occuper de tout ce qui est requetes ect pour une base de données mysql et d'autres classes annexes.
    Les messagesbox et modifications de l'interface sont la en attente d'une classe de gestion d'erreur correcte, pour débuger tout ca !

    Si vous avez d'autres conseils ils sont les bienvenus !

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