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 :

[Sockets/Thread] Comment faire passer une trame reçue vers un autre thread ?


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Points : 19
    Points
    19
    Par défaut [Sockets/Thread] Comment faire passer une trame reçue vers un autre thread ?
    Bonjour,

    Tout d'abord, excusez moi si c'est le nième post du même sujet que je poste là...

    La situation est la suivante : j'ai un serveur recevant et émettant des trames via les sockets. Je ne vais pas entrer dans les détails sur le contenu de ces trames. Ce que je souhaite est que le serveur traite la trame qu'elle reçoit en parrallèle de la réception d'une autre trame. Bref, un serveur capable d'être multitâche quant à la réception et au traitement de données.

    Le problème est que je n'arrive pas à fabriquer un thread externe qui boucle sur la réception et qui envoie la trame reçue au programme qui le traite.

    Le programme, dès son lancement, initialise le socket qui se met à boucler pour lire. Au moment où une trame arrive, ce thread le redirige vers le programme MAIS au lieu de continuer sa boucle, le thread est bloqué jusqu'à la fin du traitement ! Comment couper ça ? Existe-t-il une possibilité de passage de paramètres inter threads ?

    En vous remerciant de votre aide qui me servirait

  2. #2
    Expert éminent
    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 : 46
    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
    Points : 7 660
    Points
    7 660
    Par défaut
    Regarde du côté de la méthode ThreadPool.QueueUserWorkItem. Elle te permet de créer un nouveau thread qui exécutera la méthode indiquée en paramètre. Si ton problème se limite à la création de threads cela devrait suffir

    Sinon fait une petite recherche sur le forum, il y a eu pas mal de sujet sur les threads ces 6 dernières semaines.
    Pas de questions techniques par MP

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    il n'y a pas de vrai paramètrage au thread, sauf en utilisant les delegate paramètrés mais dans ce cas adieu la pool de thread...

    Le mieux est de faire une classe qui effectue le traitement. Dans cette classe tu prend en paramètre du constructeur la trame à traiter, et ce constructeur va soit créer un thread indépendant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    Thread thd = new Thread(Traitement);
    thd.Start();
    ...
     
    private void Traitement(void)
    {
    ...
    }
    ...
    soit sur le meme principe tu prend un thread de la pool pour fair le job.
    disons que l'intérêt des threads de la pool c'est qu'ils sont générallement déjà créés au moment où tu les appels ce qui fait que tu gagne du temps... maintenant si nombre de trames arrivent simultannément tu peux te retrouver dans un effet de "famine" si tous les threads de la pool sont occupés, ce qui peut te polluer plus qu'autre chose... (il est possible de règler la pool pour avoir plus de thread préconstruit/initialisés)

    c'est à toi de voir...

    ensuite, générallement il n'est pas souhaitable qu'un serveur soit en attente blocante sur la socket d'écoute. Il est donc conseillé de la mettre elle meme dans un thread séparé ou d'utiliser les méthodes asynchrones des classes sous jacentes, celles ci utilisent des threads pour résoudre le probleme de l'attente blocante.
    cela permet à ton programme principal de faire autre chose pendant que l'écoute est faite et que les trames sont traitées.
    tout dépend de ce que fait ton serveur, de ce que tu peux rencontré comme cas ...

    Si tu prend un serveur sur le modele de protocole que j'ai développé, bloquer le thread principal sur l'écoute est impossible, car le serveur doit de lui meme prendre l'initiative d'appeler d'autres serveurs, faire le ménage dans sa mémoire, profiter d'un manque d'activité, pour faire le ménage dans ses caches et virer ce qui ne lui sert plus, refaire d'autre calculs, sauvegarder son état mémoire régulièrement pour éviter les mauvaises surprises et faciliter la séquence de redémarrage ...

    Ensuite, il est générallement pour un serveur plus "logique" d'en faire un service windows, qui n'a pas de vrai thread principal, car il est peut probable que ton service fasse toujours quelque chose... quand il attend une connexion, il ne fait rien, il dort... le système le reveille quand une activité sur la socket est détectée.
    là l'utilisation de Timers (System.Timers.Timer de préférence plutot que System.Threading.Timer et surtout pas System.Windows.Form.Timer)
    est pratique, pour lui dire de faire d'autres opérations de maintenance... de controles...


    Tu les initialisent dans le OnStart() et tu met également toute lé mécanique

Discussions similaires

  1. [Débutant] Comment faire passer une fenêtre d'application active au 1er plan
    Par guillaume.niel dans le forum VB.NET
    Réponses: 4
    Dernier message: 08/12/2012, 23h28
  2. Réponses: 1
    Dernier message: 18/11/2010, 17h00
  3. Comment faire passer une variable en plus d'un formulaire
    Par frisouille12 dans le forum Langage
    Réponses: 1
    Dernier message: 06/08/2009, 15h06
  4. Comment faire passé une variable php vers un lecteur flash ?
    Par jeanluc974 dans le forum Intégration
    Réponses: 2
    Dernier message: 24/06/2008, 13h16
  5. Réponses: 12
    Dernier message: 05/09/2007, 14h46

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