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 :

Delphi XE5, WebService HTTPRIO Memory Leak


Sujet :

Web & réseau Delphi

  1. #1
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut Delphi XE5, WebService HTTPRIO Memory Leak
    Bonjour,

    J'ai développe un client pour un service web, et j'ai un souci de fuite mémoires.
    Suivant ce que j'utilise comme objets de mon interface, j'ai plus ou moins de fuite mémoires quand je quitte l'application.

    Je précise que c'est la deuxièmes fois que j'utilise des web services et que je constate cette anomalie.

    aide délphi
    //*****************************************************************************
    //Avant que THTTPRIO ne puisse générer une table de méthodes pour une interface invocable,
    //l'interface doit être enregistrée auprès du registre d'invocation.
    //Pour enregistrer une interface invocable,
    //utilisez la fonction globale InvRegistry pour accéder au registre,
    //et utilisez sa méthode RegisterInterface.
    //
    //Quand un objet THTTPRIO est créé en tant qu'enfant d'une fiche ou d'un module de données,
    //il doit être libéré avant la destruction de la fiche ou du module de données.
    //Quand il est créé avec un paramètre nil (Delphi) or NULL (C++),
    //il sera automatiquement détruit quand le compteur de références atteint zéro.
    voilà mes codes d'appel :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    procedure TfWebService.BeforeRRPost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
    const
       cContentHeader = 'Content-Type: application/soap+xml; charset=utf-8';
    begin
      HttpAddRequestHeaders(Data, PChar(cContentHeader), Length(cContentHeader), HTTP_ADDREQ_FLAG_REPLACE);
      //or HttpAddRequestHeaders(Data, PChar(cContentHeader), Length(cContentHeader), HTTP_ADDREQ_FLAG_ADD);
    end;
     
    function TfWebService.GetHttpRIO: THTTPRIO;
    begin
      result := THTTPRIO.Create(self);  //self pas besoin de libérer la mémoire
      try
        result.WSDLLocation := 'http://..............................';
        result.Port :=  '...............';
        result.Service :=  '............................';
        {$IFDEF DEBUG}
        result.OnBeforeExecute:= HTTPRIOBeforeExecute ;
        result.OnAfterExecute := HTTPRIOAfterExecute;
        {$ENDIF}
        result.HTTPWebNode.OnBeforePost := BeforeRRPost;
      except
        on E:exception do
        begin
          ShowMessage('erreur : '+E.Message);
        end;
      end;
    end;
     
    function TfWebService.MonService: MonServiceWS;
    begin
      // Création d'un HTTPRIO à chaque appels
      HttpRio :=GetHttpRIO; //création et paramétrage du  HttpRio
      result:= (HttpRio as MonServiceWS );
    //*****************************************************************************
      // création une et une seule fois
      // cependant ne permet pas de rappeler l'objet
    //  result:= (HttpRio as MonServiceWS);
    end;
     
    procedure TfWebService.bTestRepositoryClick(Sender: TObject);
    var
      MyDomaines  : getRepositoryResponse;
    begin
      try
        MyDomaines:=MonService.getRepository;
        //MyDomaines:= MonService(true,'',HTTPRIO1).getRepository ;
        //MyDomaines:=MonService().getRepository;
      finally
        MyDomaines:=nil;
      end;
    end;

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    C'est pourtant écrit dans la documentation !

    Je suppose que getRepositoryResponse est un TRemotable produit par MonServiceWS qui est un IInvokable

    L'appelant d'une interface invocable (client) est responsable de la création de toute instance de TRemotable qu'il transmet en paramètre d'entrée, et de la libération de toute instance de TRemotable qu'il crée ou qui est renvoyée sous la forme de paramètres de sortie ou de résultats de méthode
    MyDomaines n'est pas un type interface mais un objet TRemotable et donc ne se libèrent pas tout seul

    Remplace

    par

    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

  3. #3
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut [dcc32 Erreur] uWebService.pas(207): E2018 Type Record, Object ou Class requis
    bonjour
    Le debugger n'en veux pas ...

    dans l'interface j'ai :
    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
     
    getRepositoryResponse = array of domain; 
     
      domain = class(TRemotable)
      private
        Fdescription: string;
        Fdescription_Specified: boolean;
        Fname_: string;
        Fname__Specified: boolean;
        Ftemplates: Array_Of_template;
        Ftemplates_Specified: boolean;
        procedure Setdescription(Index: Integer; const Astring: string);
        function  description_Specified(Index: Integer): boolean;
        procedure Setname_(Index: Integer; const Astring: string);
        function  name__Specified(Index: Integer): boolean;
        procedure Settemplates(Index: Integer; const AArray_Of_template: Array_Of_template);
        function  templates_Specified(Index: Integer): boolean;
      public
        destructor Destroy; override;
      published
        property description: string             Index (IS_OPTN or IS_UNQL) read Fdescription write Setdescription stored description_Specified;
        property name_:       string             Index (IS_OPTN or IS_UNQL) read Fname_ write Setname_ stored name__Specified;
        property templates:   Array_Of_template  Index (IS_OPTN or IS_UNBD or IS_NLBL or IS_UNQL) read Ftemplates write Settemplates stored templates_Specified;
      end;
    CRLDT

    PS je n'ai plus la barre d'outil dans mon éditeur html.....

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Citation Envoyé par alheuredudejeuner Voir le message
    Le debugger n'en veux pas ...
    Ce n'est pas le debugger mais le compilateur plutôt !

    Comme je le disais ma réponse était valable si getRepositoryResponse était un TRemotable
    Hors getRepositoryResponse est un tableau de TRemotable
    Il n'était donc pas difficile de trouver la solution (faut-il la chercher un minimum)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    finally
      for I := Low(MyDomaines) do High(MyDomaines) do
        MyDomaines[I].Free();
    end;


    Sur l'importateur WSDL, il y un paramètre pour que cela génère un super objet pour un retour de fonction
    Cela génèrera le destructeur
    Voir l'option "Mapper les collections pures en types de classes wrapper" (flag -Ok-)
    Cela produirait ainsi un getRepositoryResponse de type TRemotable et éviterait d'écrire soit même le code de libération du tableau
    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
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut tout fonctionne
    merci

    j'ai tout compris. Surtout l'option d'importation que je n'ai pas testé, mais la libération fonctionne.

    Crldt

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/01/2014, 09h34
  2. Problème installation jvcl sur Delphi xe5
    Par Pierre95 dans le forum Débuter
    Réponses: 9
    Dernier message: 11/01/2014, 13h24
  3. Delphi XE5 et UIB
    Par Leesox dans le forum Bases de données
    Réponses: 11
    Dernier message: 26/12/2013, 11h35
  4. Réponses: 30
    Dernier message: 12/12/2013, 09h37
  5. Lancement Delphi Xe5 Android
    Par John Colibri dans le forum Delphi
    Réponses: 10
    Dernier message: 16/09/2013, 14h40

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