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

 Delphi Discussion :

Création de plusieurs thread dynamiquement


Sujet :

Delphi

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut Création de plusieurs thread dynamiquement
    bonjour

    je vous explique mon problème :

    j'ai une application client - serveur et à chaque connexion d'un client, je dois attendre de voir s'il est actif ou pas; pour cela le client envoie un message

    s'il n'envoie aucun message, c'est qu'il est obsolète

    mais dans ce genre d'application, les postes ne répondent pas dans un même laps de temps, à cause de plusieurs paramètre comme l'état de la connexion, la vitesse du processeur, ect; c'est pourquoi je préfère leur donner 20 secondes avant de les désigner "obsolète"

    j'ai donc pensé à créer un thread pour chaque client qui se connecte; celui ci aura une durée de vie de 20 secondes : il aura pour but de vérifier (en boucle que le client a répondu, et en cas de non réponse après les 20 secondes, il s'auto kill

    ma question est la suivante : comment procéder pour créer ce genre de thread ? il est dynamique car on ne sait pas combien on peut en avoir simultanément et ne dois pas faire ramer l'application ou la machine

    j'aurais très bien pu raccourcir ce poste en posant ma question directement, mais n'étant pas un pro des thread (j'ai juste suivie quelques tuto sur developpez et d'autres site) et donc je voulais savoir si c'était adapté à ma situation, et si c'est réalisable

    je vous remercie d'avance

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Qu'utilises tu comme composants pour le client-serveur ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    Tclientsocket et Tserversocket

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Déjà sur une machine standard, il est conseillé de ne pas dépasser 16 threads, surtout D7, après l'intégration de FastMM améliore (du moins limite les dégats si l'on abuse du thread) !

    l'utilisation de stThreadBlocking peut être dangereuse pour cette raison !

    Avec TServerSocket, tu as l'évènement OnRead, à chaque réception dans une liste de connexion, tu peux utiliser la propriété Data de chaque élements comme ceci Server.Socket.Connections[0].Data, tu peux y mettre un Objet ou Pointeur de Structure pour conserver la dernière Date de réception !

    Dans un Thread séparé ou tout bêtement dans un Timer, tu parcours la liste de Connections et tu termine les Sockets qui ne communique plus !

    Voir sur le Forum, j'ai déjà évoqué ce principe sous l'appellation de KeepAlive (soit tu implémentes ton propre KeepAlive au niveau application, soit tu plonges dans la doc TCP)

    Pour la Gestion TCP avec ServerSocket, j'ai toujours utilisé en mode stNonBlocking, tout ce qui passe dans le socket est injecté dans une ThreadList.
    Un Thread parcours cette ThreadList et gère tout le découpage de Buffer (gestion des données fragmentées en particulier), une fois l'analyse effectuée et qu'une structure est générée, on ajoute dans une 2nde ThreadList
    Un 2nd Thread parcours cette 2nde ThreadList, et va effectuer les opérations "métiers" de l'appli, cela génère une autre structure qui est déposé dans une 3eme ThreadList
    Un 3eme Thread s'occupe de parcourir la 3eme ThreadList, de transformer les structures en buffer et l'expédie vers le Client (il faut mémoriser tout le long le socket destinataire évidemment)

    Biensur le Lock est limité à la récupération du Pointeur et la suppression de l'élement dans la liste en FIFO la plupart du temps, tout traitement se fait sur e pointeur récupéré en dehors du Lock

    Structure ou Objet selon les besoins et habitudes ou pour faciliter la Sérialization

    Selon ce principe, j'ai codé des applis qui tourne 24/24 en traitant presque de 1 000 000 requêtes des clients (ce qui donne près de 10 000 000 SQL pour la partie métier) en une seule journée !

    Ne jamais faire de traitements long dans le OnClientRead, pendant ce temps les messages peuvent s'accumuler et faire déborder le tampon TCP\IP, c'est ce qui arrivait à l'un de nos partenaires lorsqu'on lui envoyait trop de données (plein de petit message, genre 40 en moins de 10 ms mais dont le traitement chez lui prenait bien plus)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    merci pour ton aide, je crois avoir trouvé un moyen d'après tes idées

    j'ai besoin d'une boucle infinie, que me conseilles tu niveau efficacité et économie des ressources de la machine ?

    le simple timer réglé sur 1 seconde ? ou autre chose ?

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    un Timer peut convenir si on ne touche pas l'appli pendant qu'elle traite des messages, cela peut géner, voir bloquer l'appli si tu as trop de traitement automatique

    sinon, un Thread, plus délicat sur l'accès au ressource mais nettement plus élégant, avec un sleep(0) ou sleep(1), voir le sujet "Mesurer le temps dans un Thread"
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    ok merci

Discussions similaires

  1. Création de plusieurs tables dynamiquement
    Par Skunkz dans le forum ASP.NET
    Réponses: 0
    Dernier message: 20/09/2010, 13h13
  2. création de plusieurs threads dans WinMain
    Par ChidoriRasengan dans le forum DirectX
    Réponses: 1
    Dernier message: 15/06/2005, 21h36
  3. Création d'un ensemble "dynamique"
    Par petitcoucou31 dans le forum Langage
    Réponses: 3
    Dernier message: 29/12/2004, 18h05
  4. création d'une librairie dynamique
    Par bilo2000 dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 26/08/2004, 15h17
  5. [Plugin] Création d'une vue dynamiquement
    Par The Bonze dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 15/06/2004, 13h23

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