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 :

TIdTCPServer (Indy 10) : Fermeture impossible si client connecté.


Sujet :

Web & réseau Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut TIdTCPServer (Indy 10) : Fermeture impossible si client connecté.
    Bonjour,

    Lorsque je souhaite fermer mon application serveur alors qu'un client est connecté, j'ai le message suivant :

    Le Projet Serveur.Exe a déclenché la classe d'exception EIdClosedSocket avec le message 'Disconnected'.

    Cette exception est déclenchée lorsque que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    idTcpServer.Active := False;
    dans l'événement FormCloseQuery de la Form principale et je n'arrive pas à intercepter l'exception et mon application reste figée et ne s'arrête pas.

    Quelqu'un aurait-il une idée pour m'aider ?


    Nota: J'utilise les objets Indy 10.


    Cordialement
    Daniel

  2. #2
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    salut,
    tu as essayé ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try
      idTcpServer.Active := False;
    except
      //ne rien faire
    end;

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    J'ai essayé de mettre faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    try
      idTcpServer.Active := False;
    except
    end;
    mais cela ne change rien, l'application se fige.

    Cordialement
    Daniel

  4. #4
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Salut,

    L'exception est normale. Elle est à ignorer.

    Si l'application se fige, c'est parce que tu es en environnement multithread, et qu'un thread en attend un autre, qui attend le premier... Et dans ton cas un des deux est le thread principal.

    Exemple : un des threads (pas le principal) du serveur fait un synchronize (pour afficher qqchose sur la form), puis avant qu'il ne se fasse le thread principal appelle Serveur.Active := False; ce qui le lock le temps que tous les threads du serveur tombent. Mais vu que le thread principal attend que les autres tombent, et que l'un d'eux attend la synchro avec le thread principal, qui ne peut se faire puisque ce dernier est locké, bin -> appli figée...

    Voilà je pense que c'est un truc sympathique dans le genre... J'ai déjà eu le plaisir non dissimulé d'avoir des cas similaires, c'est pour ça que je t'en fais profiter..., histoire que tu ais déjà les bonnes causes. Quant à la solution, c'est à toi de la trouver en étudiant ton code, mais tu peux toujours proposer les points sur lesquels tu doutes.

    Bon courage !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Il est vrai qu'au moment de fermer mon application il y a deux threads qui tournent ("IdTCPServer Listener" et "IdTCPServerScheduler User") et quand je fais :

    IdTCPServer.Active := True;

    Le thread "IdTCPServer Listener" s'arrête mais j'ai une exception "EIdClosedSocket avec le message Disconnected" qui monte mais le thread "IdTCPServerScheduler" User continue de tourner et je ne vois pas comment je peux faire pour arrêter le ou les threads "IdTCPServerScheduler User" avant de procéder à l'arrêt du thread "IdTCPServer Listener" par l'instruction :

    IdTCPServer.Active := True;

    Il n'y a pas d'autres threads que ceux gérer par le composant Indy "IdTCPServer" qui tournent au moment de l'arrêt de mon application.

    Je n'est pas d'appel à des méthodes de synchronisation.

    Quelqu'un pourrait-il m'aider ?

    Cordialement
    Daniel

  6. #6
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Salut,

    Je pense que tu y verras plus clair sur ce problème là lorsque tu auras réglé la synchronisation avec l'affichage dont nous avons parlé ici :
    http://www.developpez.net/forums/sho...d.php?t=135372

    En effet, si tu utilisais des sections critiques de façon inapropriée, il est fort probable que tu ais des problèmes pour faire tomber proprement tous les threads du serveur.

    En tous cas, il faut bien avoir en tête que le thread qui appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     IdTCPServer.Active := False;
    (le thread principal normalement) va être bloqué, puis relaché lorsque tous les listenning threads seront terminés.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Merci pour toutes ces informations, j'avais bien un problème, j'avais un thread toujours actifs au moment de fermer mon application. J'ai pu régler le problème.

    Cordialement
    Daniel

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

Discussions similaires

  1. Indy => Client Connecter a plusieurs servers
    Par benda95280 dans le forum Débuter
    Réponses: 0
    Dernier message: 02/05/2009, 11h24
  2. [Installation] [Client] impossible de se connecter : Unrecognized URL scheme
    Par blueman1 dans le forum Subversion
    Réponses: 3
    Dernier message: 27/04/2009, 23h37
  3. [BO XI R2] Impossible de se connecter en client lourd
    Par baime dans le forum Administration-Migration
    Réponses: 16
    Dernier message: 25/11/2008, 16h59
  4. [OCI] Impossible de se connecter à une base 8 avec un Instant Client
    Par localhost dans le forum Interfaces de programmation
    Réponses: 8
    Dernier message: 18/11/2008, 12h10
  5. Clients : Impossible de se connecter à mon adresse IP
    Par Poison_xtreamlua dans le forum Réseau
    Réponses: 8
    Dernier message: 05/08/2008, 14h56

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