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

API, COM et SDKs Delphi Discussion :

TIdTCPServer / active:=false / application bloquée ?


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2002
    Messages : 84
    Par défaut TIdTCPServer / active:=false / application bloquée ?
    Bonjour,

    J'ai fait différents tests des composants Indy 10 et me voilà bloqué sur le problème qui suit :

    L'application est des plus basique (1 forme, 1 TIdTCPServer, 1 mémo, 1 bouton Start, 1 bouton Stop) Voir le code des méthodes ci-dessous
    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
     
    procedure TForm1.pxyButtonStartClick(Sender: TObject);
    begin
      pxyMemo.Lines.Add('Listening on port ' + IntToStr(pxyIdTCPServer.DefaultPort));
      pxyIdTCPServer.Active := true;
    end;
     
    procedure TForm1.pxyButtonStopClick(Sender: TObject);
    begin
      pxyIdTCPServer.Active := false;
      pxyMemo.Lines.Add('Stop listening on port ' + IntToStr(pxyIdTCPServer.DefaultPort));
    end;
     
    procedure TForm1.pxyIdTCPServerConnect(AContext: TIdContext);
    begin
      pxyMemo.Lines.Add('Connexion de "' + AContext.Connection.Socket.Binding.PeerIP + ':' + IntToStr(AContext.Connection.Socket.Binding.PeerPort) + '"');
    end;
     
    procedure TForm1.pxyIdTCPServerDisconnect(AContext: TIdContext);
    begin
      pxyMemo.Lines.Add('Déconnexion de "' + AContext.Connection.Socket.Binding.PeerIP + ':' + IntToStr(AContext.Connection.Socket.Binding.PeerPort) + '"');
    end;
     
    procedure TForm1.pxyIdTCPServerExecute(AContext: TIdContext);
    var
      Line : String;
      StrWasSplit : Boolean;
    begin
      Line := AContext.Connection.IOHandler.ReadLnSplit(StrWasSplit, #13, 10000);
      pxyMemo.Lines.Add('Received : ' + Line);
    end;
    Mon problème est le suivant : si une connexion a été effectuée, lorsque je clique sur le bouton Stop, toute l'application se fige pendant l'exécution de la ligne "pxyIdTCPServer.Active := false;", et ceci indéfiniment. Par contre, si aucune connexion n'a eu lieu, la ligne s'exécute sans s'arrêter !

    Une idée pour m'aider ???

    Je dois avoir loupé une information sur l'utilisation de ce composant car toutes les recherches que j'ai faites à ce sujet expliquent que pour arrêter le TIdTCPServer, il suffit de passer sa propriété "Active" à false !!!

    Merci d'avance.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Par défaut
    1. Quelle version d'Indy ? De Delphi ?
    2. Pour commencer, il serait bien d'éliminer toute modification d'objets de la VCL dans pxyIdTCPServerConnect, pxyIdTCPServerDisconnect, pxyIdTCPServerExecute. Comme expliqué dans la FAQ Indy sur ce site, il s'agit de threads secondaires qui exécutent ces événements et qui ne doivent pas toucher à des éléments de la VCL sous peines de diverses violations d'accès, exceptions bizarres et autres soucis qui peuvent se rapprocher de ce que tu rencontres.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2002
    Messages : 84
    Par défaut
    Hello,

    Pour te répondre :

    1. Comme cité, Indy 10. Oublié, BDS 2006.

    2. J'ai bien pris note de ta remarque, mais comme tu peux le voir dans mon exemple de code, je ne touche pas aux objets VCL mis à part ajouter des lignes dans un mémo ! Devrais-je même supprimer ceci ? Réponse = OUI ??? Je viens de faire le test en ajoutant mes msg directement dans une TStringList et j'utilise un Timer qui va relire cette StringList pour l'afficher dans le mémo. Dès lors, plus de bloquage !!

    Je dois dire que je suis assez stupéfait ...

    Je te remercie de ton aide. Je clôture le post. Bonne journée.

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

Discussions similaires

  1. Application bloquée côté client
    Par Michelk12 dans le forum Framework .NET
    Réponses: 2
    Dernier message: 28/10/2007, 11h29
  2. [VBA-E] Activer une application ouverte
    Par Scritch852 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/05/2007, 15h45
  3. Application bloquée à la première exécution
    Par chris28200 dans le forum Général Java
    Réponses: 7
    Dernier message: 20/09/2006, 18h31
  4. problème avec IdUDPServer1.Active:=false
    Par korntex5 dans le forum Delphi
    Réponses: 1
    Dernier message: 18/08/2006, 15h54
  5. Application bloquée
    Par bilal_ini dans le forum Langage
    Réponses: 4
    Dernier message: 22/11/2005, 14h32

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