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

Composants VCL Delphi Discussion :

Composant, socket et question de logique


Sujet :

Composants VCL Delphi

  1. #1
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut Composant, socket et question de logique
    Salut,
    je suis en train d'écrire un composant qui implémente un protocole basé sur TCP.
    Comme j'ai des sockets à gerer, j'utilise le composant Indy TidTCPClient.
    jusque la ... tout va bien .

    Ma premiere question est la suivante :
    - L'instance de TidTCPClient doit-elle être autonome ?
    Actuellement, j'ai encapsulé une TidTCPClient dans mon composant en tant qu'attribut privé. Ca marche, mais je ne suis pas sûr que cela soit la façon la plus "propre" de faire. J'ai pensé à deux autres possibilités :
    soit encapsuler aussi le TidTCPClient dans mon composant mais en le liant à une propriété (published),
    soit ne mettre qu'une propriété qui soit une référence pointant vers un objet TidTCPClient autonome (le développeur devrait poser un TidTCPClient sur la form de son application, et lier l'instance de mon composant au TidTCPClient par le biais de la propriété).
    Bref, en tout ça me fait trois possibilités et je ne sais pas laquelle est la meilleure.




    Voici ma deuxième question :
    Mon composant (qui est un client), devra une fois qu'il sera connecté au serveur lire les informations que ce dernier envoie dans la socket.
    Le problème, c'est que je ne sais pas QUAND le serveur va envoyer des données ni en quelle quantité.
    De plus, je n'ai pas trouvé d'évenement du TidTCPClient qui me permette d'associer un traitement qui s'active uniquement quand des données arrivent (si de tels évenement éxistent, je ne sais pas comment m'en servir et j'aimerais bien savoir).
    Pour l'instant, la seule solution que j'ai trouvé c'est de lire une quantité déterminée d'octets, mais cette solution ne me convient pas car en attendant qu'une quantité suffisante de données soient envoyées par le serveur, mon TidTCPClient bloque des ressources et en plus, cela créé des problèmes à la destruction de l'objet
    voici donc ma question :
    - Quelle est la bonne manière de procéder pour lire les données emises par le serveur avec un TidTCPClient ?

    Voila ca fait déja pas mal de questions, merci à ceux qui ont eu le courage de me lire jusqu'au bout.
    Je sais pas si j'ai été bien clair, mais si vous voulez que je donne plus de détails et/ou des sources y'a pas de problème mais ca sera seulement apres 19h (tout est chez moi et je suis au boulot).
    Merci d'avance

  2. #2
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    Bon, après mûre reflexion, j'ai trouvé une quatrième solution qui me convient mieux :
    j'ai hérité la Classe TIdTCPClient en ajoutant les attributs, methodes et propriétés propres à mon composant.
    Pour la lecture dans la socket, j'ai créé un thread qui tourne en boucle (avec une pause à chaque boucle pour ne pas bouffer trop de cpu) et notifie un évenement à son parent (mon composant) lorsque des données ont été envoyées par le serveur.
    Je pense que c'est comme ça qu'il faut procéder.
    En tout cas, c'est comme ca que fonctionnent les composants Indy qui implémentent des protcoles basés sur tcp (exemple : TIdTelnet).

    Le seul doute qui me reste c'est la façon dont il faut s'y prendre pour vérifier si le serveur à envoyé des données :
    dans la boucle de mon thread (décrit ci-dessus) je fais le test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     if (AslskClient.CurrentReadBufferSize=0)
              then
                     begin
                             sleep(100);
                     end
              else
                     begin
                             if(Assigned(FOnDataAvailable))
                                     then OnDataAvailable(Self);
                     end;
    ce if est dans une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (not Self.Suspended)
    et ASlskClient représente mon composant propriétaire du thread.
    Le problème, c'est que ça ne marche pas super bien : l'évenement OnDataAvailable est bien lancé lorsqu'il faut, mais lorsque rien ne se passe l'éxécution du thread bloque toute l'appli
    Est-ce que c'est bien CurrentReadBufferSize que je dois employer ? ou y-a-t-il un meilleur moyen de vérifier l'arrivée des données dans la socket ?

    Merci d'avance

Discussions similaires

  1. Composant Socket + Thread
    Par Bily.sdi dans le forum C++Builder
    Réponses: 4
    Dernier message: 18/10/2007, 16h48
  2. [Débutant] Les Sockets, petite question
    Par fantomasmusic dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 13/06/2007, 19h22
  3. Probleme avec les composant socket de builder
    Par lol733 dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/10/2006, 12h22
  4. socket, propogation, question
    Par narkotik dans le forum C++
    Réponses: 2
    Dernier message: 22/07/2006, 20h35
  5. Composants sockets
    Par the watcher dans le forum Web & réseau
    Réponses: 2
    Dernier message: 01/11/2005, 17h33

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