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 :

Gestion de la mémoire DLL .net importée sous Xe4


Sujet :

Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 55
    Points
    55
    Par défaut Gestion de la mémoire DLL .net importée sous Xe4
    Bonjour,

    J'ai importé une librairie compilé en .Net. dans un projet sous Xe4 sous forme d'une unité.
    J'utilise les fonctions et tout fonctionne parfaitement. Je peux constater une monté de la mémoire utilisé par mon programme, ce qui est normal car je lis beaucoup de données provenant d'un fichier .grb2

    Mais après la destruction des objets instanciés et même de la fenêtre qui réalise ma fonction, aucune libération de mémoire ne s’effectue !

    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
     
    FgribReadingFile := TgribReadingFile.Create;
     
      FgribReadingFile.gribValues := TDictionary<TdateTime, TGribFileRecord>.Create;
     
      FgribReadingFile.Grib2Input := nil;
      FgribReadingFile.Grib2Input := CoGrib2Input.Create;
      FgribReadingFile.Grib2Input.setFilename(ExtractFilePath(paramStr(0)) + 'Grib\'
        + fileGribName);
      FgribReadingFile.Grib2Input.scan(False, False);
     
      ProgressBar1.Max := FgribReadingFile.Grib2Input.RecordsCount - 1;
      FgribReadingFile.rec2 := Nil;
      FgribReadingFile.recData2 := nil;
      for I := 0 to FgribReadingFile.Grib2Input.RecordsCount - 1 do
      begin
        ProgressBar1.Position := I;
    .....
    Après ma procédure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FgribReadingFile.Grib2Input.closeFile;
    FgribReadingFile.recData2.closeFile;
    FgribReadingFile.Destroy;
    Et voici la procédure "Destroy" de TgribReadingFile surchargée où je libère tous les objets précédemment créés:

    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
     
    Destructor TgribReadingFile.Destroy;
    begin
       Grib2Input := Nil;
       Grib1Input := Nil;
       rec2 := Nil;
       rec1 := Nil;
       if recData1 <> nil then
       begin
         recData1.closeFile;
         recData1 := Nil;
       end;
       if recData2 <> nil then
       begin
         recData2.closeFile;
         recData2 := Nil;
       end;
       if gribValueObj <> nil then
         gribValueObj.Destroy;
       if filesvalue <> nil then
         filesvalue.Destroy;
       grecord := Nil;
       if gribValues <> nil then
       begin
         // FreeMemory(gribValues);
         gribValues.Destroy;
       end;
       inherited Destroy;
    end;
    Quelqu'un aurait-il déjà constaté pareil comportement ?

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par curt25 Voir le message
    Quelqu'un aurait-il déjà constaté pareil comportement ?
    Avez vous testé votre application après avoir activé l'option de détection des fuites mémoires du Gestionnaire de mémoire de XE4 (qui n'est je le rappelle qu'une version light de FasrMM4) et recompilé ?
    Pour ce faire, il suffit de rajouter la ligne suivante dans le fichier .dpr du projet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // A n'intégrer qu'en mode Debug
    {$IFDEF DEBUG}
      // Désactive l'avertissement lié à la plateforme (car compilé pour windows) 
      {$WARN SYMBOL_PLATFORM OFF}
        // Les fuites de mémoires seront détectées et signalées
        System.ReportMemoryLeaksOnShutdown := DebugHook <> 0;
      {$WARN SYMBOL_PLATFORM ON}
    {$ENDIF}
    ReportMemoryLeaksOnShutdown := DebugHook <> 0;
    Philippe.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 55
    Points
    55
    Par défaut
    Bonjour,

    Merci Ph. B. pour votre suggestion. Non il ne m'indique rien quand je ferme mon application et que la variable globale "ReportMemoryLeaksOnShutdown" est activée.

    Afin de vérifier la commande j'ai placé le code suivant sous un bouton:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TfrmGribsFileOverview.Button1Click(Sender: TObject);
    var
      ptr: Pointer;
    begin
      ReportMemoryLeaksOnShutdown := True;
      ptr := AllocMem(50000);
    end;
    Après de multiple clics, aucun message quand l'application se termine.

    Merci pour votre aide.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    @curt25 le ReportMemoryLeaksOnShutdown := DebugHook <> 0; est à mettre dans le fichier DPR et nulle part ailleurs AMHA

    @Philippe je ne suis pas sur de comprendre le pourquoi de la ligne 9 de ton code ni le IFDEF DEBUG d'ailleurs , je ne mets que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     // Désactive l'avertissement lié à la plateforme (car compilé pour windows) 
      {$WARN SYMBOL_PLATFORM OFF}
        // Les fuites de mémoires seront détectées et signalées
        System.ReportMemoryLeaksOnShutdown := DebugHook <> 0;
      {$WARN SYMBOL_PLATFORM ON}
    et encore quelque fois plus simplement l'instruction seule étant donné que je fais le debug sous windows en 32 bits en version debug et que je déploie les versions en release par la suite (bon tu me rétorqueras que pour l'instant mes applications sont toujours pour des cibles windows, même si pour les nouvelles écrites en FMX les cibles pourraient se diversifier )

    Meilleurs vœux
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par curt25 Voir le message
    Après de multiple clics, aucun message quand l'application se termine.
    Dans ce cas, c'est qu'à un autre endroit de votre code, ReportMemoryLeaksOnShutdown := False; est appelé et ultérieurement à votre gestionnaire d'événement OnClick du bouton, voire que le gestionnaire d'évènement n'est pas affecté...

    Citation Envoyé par SergioMaster Voir le message
    @Philippe je ne suis pas sur de comprendre le pourquoi de la ligne 9 de ton code ni le IFDEF DEBUG
    C'est très loin d'être primordial en effet, cela évite juste de compiler l'instruction en mode Release... Une (toute petite) optimisation en fait !

    Citation Envoyé par SergioMaster Voir le message
    Meilleurs vœux
    Meilleurs vœux également...
    Philippe.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 55
    Points
    55
    Par défaut
    Bonjour et meilleur vœux...

    Effecticement j'ai juste mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReportMemoryLeaksOnShutdown := DebugHook <> 0;
    dans le dpr juste avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Application.Initialize;
    "ReportMemoryLeaksOnShutdown" n'est pas utilisé autre part dans le code. Mais je n'ai pas d'erreur de fuite de mémoire à la fermeture du programme.

    Or ma procédure de test ou celle qui est en cause initialement font bien augmenter la charge de mémoire de mon programme.

    Merci pour votre aide.

  7. #7
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par curt25 Voir le message
    "ReportMemoryLeaksOnShutdown" n'est pas utilisé autre part dans le code. Mais je n'ai pas d'erreur de fuite de mémoire à la fermeture du programme.

    Or ma procédure de test ou celle qui est en cause initialement font bien augmenter la charge de mémoire de mon programme.
    L'absence de message à la fermeture du programme n'est possible que si ReportMemoryLeaksOnShutdown = False !
    Soit vous avez compilé en mode Release (et exécuté en mode sans débogage), soit vous n'avez pas branché le gestionnaire d'évènement, soit la variable est réinitialisé à Faux quelque part avant la fermeture du programme...

    Sinon vous auriez eu un message indiquant qu'autant de blocs de 50xxx octets (que de clics) n'ont pas été libérés.
    Philippe.

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 55
    Points
    55
    Par défaut
    Bonjour,

    Je vous assure que qu'il y a juste cette ligne dans le fichier dpr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.ReportMemoryLeaksOnShutdown := DebugHook <> 0;
    Application.Initialize;
    La variable globale "ReportMemoryLeaksOnShutdown" n'est jamais réinitialisée à Faux dans le programme.
    Désolé je ne comprends pas votre phrase:
    soit vous n'avez pas branché le gestionnaire d'évènement
    Sinon je vais regarder pour utiliser "fastMM"!

    Merci pour votre aide.

  9. #9
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par curt25 Voir le message
    Désolé je ne comprends pas votre phrase:
    soit vous n'avez pas branché le gestionnaire d'évènement
    L'événement OnClick du bouton Button1 n'est pas affecté depuis l'EDI (Evénement OnClick dans l'inspecteur d'objet) et n'est pas non plus affecté à l'exécution Button1.OnClick := Button1Click;
    Philippe.

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Question bête : la dll est-elle déchargée à la fin du programme ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 55
    Points
    55
    Par défaut
    Bonjour,

    Citation Envoyé par SergioMaster Voir le message
    Question bête : la dll est-elle déchargée à la fin du programme ?
    Je ne saurais dire si la DLL est déchargée à la fin du programme ! Je pense que non car à l'importation, Il m'a créé une Unité "[Name]_TLB.pas".
    Ensuite j'instancie des objets des classes présentes dans cette unités. Et bien sûre à la fin du traitement, je libère tous les objets. (.Destroy .Free ...).

    Mais à aucun moment la mémoire accumulée lors du processus n'est libérée à la fin.

    Merci pour votre aide.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/04/2013, 13h29
  2. Dll écrite en C++ et importée sous VB6.
    Par Doomdoom dans le forum C++
    Réponses: 3
    Dernier message: 21/02/2007, 13h50
  3. Réponses: 3
    Dernier message: 31/08/2006, 11h59
  4. DLL Delphi utilisée sous VB.NET
    Par slimjoe dans le forum Langage
    Réponses: 2
    Dernier message: 09/01/2006, 00h12
  5. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 15h28

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