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

C# Discussion :

Thread + Socket : Passage par parametre, je galere !


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 21
    Par défaut Thread + Socket : Passage par parametre, je galere !
    Bonjour,

    J'ai un proxy qui tourne bien en C++. Je debute le C#, et pour commencer, je voulais "migrer" ce proxy du C++ vers le C#.

    Bon, sans rentré dans les details, j'ai mon main, dedans je crée une socket, puis juste apres, pour chaque accept, je crée un thread (classique quoi !)
    Dans le thread, je reutilise ma socket. En c++, c'etait simple, je passait la socket en parametre, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DWORD WINAPI proxy (LPVOID psocket)
    {
    [...]
    //Recuperation de la valeur du socket (par pointeur)
    	SOCKET * ps = (SOCKET *)psocket;
    	SOCKET socket_client = *ps;
    [...]
    }
    En C#, c'est apparament moins simple d'utiliser les passages par parametre avec les socket. J'ai utilisé une methode trouvé sur le net :
    Je crée ma fonction proxy dans une autre classe :
    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
        public class MyProxyHandle
        {
            public Socket socket_client;
     
            // Constructeur
            public MyProxyHandle(Socket socket_client)
            {
                this.socket_client = socket_client;
            }
     
            // Méthode de modification du paramètre
            public void SetParam(Socket param)
            {
                this.socket_client = param;
            }
     
            //fonction trhead
            public static void Proxy()
            {
    	//[ici je veut utiliser socket_client, mais je n'y arrive pas !]
    	}	
        }
    L'appel de mon thread se fait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyProxyHandle ProxyHandle = new MyProxyHandle(socket_client);
    Thread T = new Thread(new ThreadStart(MyProxyHandle.Proxy));
    T.Start();
    Ai-je fais une erreur ? Où ? Comment faire ?
    Pff, le passage du C++ au C# est plus compliqué qu'il me semblait !

    Merci

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par Xav987 Voir le message
    [ici je veut utiliser socket_client, mais je n'y arrive pas !]
    Tu pourrais préciser ce qui te bloque (erreur de compil, exception, ...), ce serait sympa

    Sinon plutôt que de coder ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Méthode de modification du paramètre
    public Socket socket_client;
     
    public void SetParam(Socket param)
    {
        this.socket_client = param;
    }
    utilise les propriétés en C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private Socket _socket;
     
    public Socket MySocket
    {
        get { return this._socket; }
        set { this._socket = value; }
    }
    Et pour démarrer le thread utilise plutôt le ThreadPool, plus performant en règle générale et parce que dans ton cas tu n'as pas besoin d'avoir une référence sur le Thread (pas besoin de suspendre, arrêter le thread, car ce sera interne en détectant la déconnexion sur la socket de travail). A ce moment change
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyProxyHandle ProxyHandle = new MyProxyHandle(socket_client);
    Thread T = new Thread(new ThreadStart(MyProxyHandle.Proxy));
    T.Start();
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyProxyHandle ProxyHandle = new MyProxyHandle(socket_client);
    ThreadPool.QueueUserWorkItem(MyProxyHandle.Proxy);
    par contre il faudra modifier le prototype de la méthode Proxy pour lui ajouter un paramètre de type object, car la méthode QueueUserWorkItem attend ce type de prototype.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 21
    Par défaut
    Merci de ta reponse.

    Ce qui me bloque ? ça :

    Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique

    Et je n'arrive pas à utiliser la variable. Comme si cette variable n'existait pas.

    Je vais essayé tes modifications...
    Il n'y a pas de solutions plus simple pour passer un parametre à un thread ?

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par Xav987 Voir le message
    Ce qui me bloque ? ça :

    Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique
    C'est parce que Proxy est une méthode statique (je ne l'ai pas vu au premier coup, faut que j'apprenne à lire ^^), donc tu ne peux pas utiliser this dans une telle méthode et donc tu ne peux accéder à la socket. On peut accéder aux membres de classe (statiques) dans une méthode d'instance (non statique) mais le contraire n'est pas vrai. Bref, tu ne dois pas la déclarer en static, et lorsque tu lances ton thread il faut utiliser ProxyHandle.Proxy et non MyProxyHandle.Proxy

    Sinon avec le ThreadPool tu peux faire ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // On lance le thread de "travail"
    // socket = référence sur un objet Socket obtenue 
    // suite à l'accept sur la socket d'écoute.
    ThreadPool.QueueUserWorkItem(Proxy, socket);
    Et pour la méthode Proxy, qui peut être dans la même classe qui la gestion de l'écoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void Proxy(object state)
    {
        Socket socket = state as Socket;
        if (socket != null)
        {
            // utilisation de la socket.
            // si déconnexion faire un simple return pour finir le thread.
        }
    }
    Ca t'évite l'utilisation d'une classe intermédiaire (MyProxyHandle) si elle ne te sert à rien d'autre que contenir le traitement (méthode Proxy).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 21
    Par défaut
    OK, je vais utiliser ThreadPool alors, parce qu'au debut je voulais resté dans la meme classe. J'avais crée une classe justement à cause de cette histoire de parametre.

    Je te remercie pour toutes ces precisions

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

Discussions similaires

  1. Thread et passage de parametre
    Par olibara dans le forum C#
    Réponses: 12
    Dernier message: 29/11/2011, 13h35
  2. passage par parametre
    Par fainardi83 dans le forum C
    Réponses: 2
    Dernier message: 22/03/2011, 16h01
  3. [THREAD][AFX]Passage de parametre
    Par Kin0u dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 09/09/2009, 11h48
  4. passage par parametre d'un double tableau
    Par nakac dans le forum C
    Réponses: 2
    Dernier message: 21/12/2008, 03h27
  5. [pl/sql] passage par parametre
    Par imedg dans le forum Oracle
    Réponses: 4
    Dernier message: 10/12/2006, 09h22

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