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

Web & réseau Delphi Discussion :

Indy : Liste des Threads Actifs avec leurs propriétés/Membres


Sujet :

Web & réseau Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Points : 34
    Points
    34
    Par défaut Indy : Liste des Threads Actifs avec leurs propriétés/Membres
    Bonjour

    Dans le cadre d'un mini-projet, je dois créer un serveur tcp avec delphi. J'ai choisi Indy pour sa facilité, mais je bloque sur un problème: je dois empêcher deux clients ayant le même Identificateur de se connecter en même temps.
    Le client envoieau serveur son identificateur aussitôt connecté.
    Je précise bien qu'un même id ne peut pas se connecter 2 fois simultanément au serveur: la distinction se fait sur l'identificateur pas sur l'IP.

    Ce que j'ai essayé de faire, c'est créer un nouveau type record (TClient: id, dateconnexion.., puis un pointeur vers ce type : PClient) que je transtype en TObject et que je stocke ensuite dans le champ data de TidPeerThread.

    le code ressemble à ceci:

    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
     
    procedure serveurConnect(AThread: TIdPeerThread);
    var
      NewClient: PClient;
    begin
      AddLogLine('Nouveau Client à ' + DateTimeToStr(Now) );
     
      GetMem(NewClient, SizeOf(TClient));
      NewClient.PeerIP      := AThread.Connection.Socket.Binding.PeerIP;
      NewClient.dtConnected   := Now;
      NewClient.LastAction  := NewClient.dtConnected;
      NewClient.Thread      := AThread;
     
      AThread.Data := TObject(NewClient);
    end;
    Ensuite après chaque nouvelle connexion, je dois vérifier si le nouveau client est déjà connecté. J'en suis pas encore là: je bloque rien qu'en essayant d'afficher dans un TMemo les données des Threads Actifs du serveur.
    Ci-dessous mon Code:
    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
    30
    31
    32
     
    var
     fTL: TList;//TThreadList;
     fClient: PClient;
     fTLCount, i: integer;  //nombre de threads actifs
     fIpClient: TIdPeerThread;
    begin
    try
     begin
      try
        fTL := TList.Create;
        fTL := thManager.ActiveThreads.LockList; 
       //thManager: ThreadManager du TidTCPServer
     
        fTLCount := fTL.Count;
        mmTh.Lines.Add('Nombre de Clients Connectés : ' + IntToStr(fTLCount));
        i := 0;
        while i < fTLCount do
         begin
          fClient := PClient(TIdPeerThread(fTL.Items[i]).Data);
          Memo.Lines.Add(DateTimeToStr(fClient.dtConnected));
          inc(i);
         end;
      finally
        thManager.ActiveThreads.UnlockList;
      end;
     end
    except on e:exception do
     begin
      thManager.ActiveThreads.UnlockList;
      Memo.Lines.Add('Erreur : ' + e.Message);
     end
    Où-est-ce que je me trompe? Que dois-je changer?

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    mmh caster un record en TObject pour moi cela sent les problèmes à plein nez

    Et si au lieu d'utiliser un record tu passes directement par une classe ?
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    Bonsoir,

    mmh caster un record en TObject pour moi cela sent les problèmes à plein nez

    Et si au lieu d'utiliser un record tu passes directement par une classe ?
    En fait, je passais le pointeur du record, pas le record lui-même, mais c'est vrai que ça sens la bêtise :p

    Par contre, même en essayant avec une classe, le problème reste le même !!
    l'application plante, quand je débogue, le problème semble provenir de l'affectation de l'instance de ma classe au champ data de AThread:

    Athread.data := TObject(instance_de_ma_classe)

    je me demande si je devrais pas hériter mon propre TidPeerThread, et y ajouter ce que je désire afin d'éviter ça

Discussions similaires

  1. [Article] Liste des balises et de leurs enfants pour une validation XHTML 1.1
    Par giminik dans le forum Publications (X)HTML et CSS
    Réponses: 12
    Dernier message: 12/02/2018, 15h11
  2. [Batch] Liste des sous-dossiers avec leur nom et le nombre de fichier inclus
    Par sencha dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 05/02/2015, 10h27
  3. list des threads
    Par abou_alkassim dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 15/12/2006, 10h58
  4. Réponses: 2
    Dernier message: 04/10/2002, 09h13

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