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

Bases de données Delphi Discussion :

Libération mémoire TSQLQuery


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut Libération mémoire TSQLQuery
    Bonjour, Voici le code suivant :


    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
    procedure TFrmTest.TestMemoire;
    var TWork : TSQLQuery;
        MontantRegl : Double;
     
    begin
      Stop:=false;
      TWork := TSQLQuery.Create(nil);
      Try
        TWork.SQLConnection := dmdMainExpress.dbMain;
        TWork.Sql.Text :='select * from facture_fac';
        TWork.Open;
        while (Not TWork.eof) and (not stop) do
        begin
          MontantRegl := TWork.FieldByName('FAC_ID').AsDouble;
          TWork.next;
        end;
        showmessage(currtostr(MontantRegl));
      Finally
        TWork.Close;
        freeandnil(TWork);
      End;
     
    end;

    Lors du freeandnil, la mémoire utilisé par mon exe ne rebaisse pas : Je ne comprend pas pourquoi!

    Merci de m'aider.
    Delphi 6 entreprise & interbase 6

    Bonne journée 8)

    Tout programme non trivial contient au moins un bug.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    En cherchant un peu, j'ai pu lire le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure FreeMemory;
    var
      MainHandle : THandle;
    begin
      MainHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE,
    GetCurrentProcessID);
     try
      SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF);
     finally
      CloseHandle(MainHandle);
     end;
    end;
    Il fait baisser la mémoire d'une façon radical
    Quelqu'un peut m'en dire plus sur ce code ? n'est-il pas dangereux ?

    Merci

    [EDIT MODERATION] Utilisez les balises Code et /Code (le # dans la barre d'outils) au lieu de quote et /quote
    Delphi 6 entreprise & interbase 6

    Bonne journée 8)

    Tout programme non trivial contient au moins un bug.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    Bonjour, je reviens a la charge, ce probème de mémoire persiste.

    J'ai toujours le problème. Sur les gros traitements, la mémoire virtuelle de windows augmente sans cesse, même si je libère correctement tous mes composants et evidemment, mon prog plante ne 'mémoire virtuelle insuffisante' au bout d'un moment. Je ne comprend vraiment pas pourquoi. Je valide mes données périodiquement (sur les tclientdataset), je libère mes composants en fin de procédures (tsqlquery..., j'ai vérifié avec un outil spécialisé)

    Mon exe est en local et ma sgbdd (firebird) sur un serveur. c'est bien mon poste local qui plante.

    C'est un projet professionnel, j'ai vraiment besoin d'aide si solution il y a !

    merci
    Delphi 6 entreprise & interbase 6

    Bonne journée 8)

    Tout programme non trivial contient au moins un bug.

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Si tu exécutes cette requete souvent et que l'objet TSQLQuery n'est pas utilisé simultanement par plusieurs thread, Je te conseil de ne pas utiliser la création dynamique et d'en faire un objet statique.
    Ca te coutera moins en ressource (pas de construction ni destruction) et s'il y avait fuite de mémoire à la destruction, il n'y en aura plus.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    J'ai testé cette solution , en utilisant un clientdataset posé sur une fiche que je crée au démarrage de mon traitement, et que je détruit seulement à la fin de ce traitement, et malheureusement .... ça ne change rien !
    Merci quand même !
    Delphi 6 entreprise & interbase 6

    Bonne journée 8)

    Tout programme non trivial contient au moins un bug.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    Heoo,

    est ce que par hasart, la mémoire virtuelle utilisé par mon aplli est maintenu tant que ma connection de base de donnée est ouverte ?

    si oui, aucun moyen de détourné la solution de fermer et réouvrir la base de donnée ?

    Merci pour vos réponses
    Delphi 6 entreprise & interbase 6

    Bonne journée 8)

    Tout programme non trivial contient au moins un bug.

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Pour ma part je n'ai pas assez d'expérience sur DBExpress pour t'en dire plus.

    est ce que par hasart, la mémoire virtuelle utilisé par mon aplli est maintenu tant que ma connection de base de donnée est ouverte ?

    si oui, aucun moyen de détourné la solution de fermer et réouvrir la base de donnée ?
    A toi de tester, ferme ton SQLConnexion et réouvre le après. et vois si ca libère bien les ressources prises
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  8. #8
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    je n'ai pas de souci avec dbExpress de ce genre. (quasiment toutes mes requetes sont en dynamiques).

    Par contre j'utilise une base Oracle, il n'y aurait pas une mise à jour du driver de DbExpress pour Firebird?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    Et bien il semblerait que ce phénomène se produit en delphi v2006, mais pas dans la version précédente v7. Effectivement peut être un pb de version ou de paquet .... Nous allons continuer nos tests !
    Delphi 6 entreprise & interbase 6

    Bonne journée 8)

    Tout programme non trivial contient au moins un bug.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    ça y est, j'ai fini par trouvé.

    J'avais un composant SQLMonitor sur mon projet, lié a mon TsqlConnection, qui générait ce problème de mémoire malgré qu'il soit inactif (propriété active = false).

    Je pense que c'est un bug de ce composant en Delphi V2006, car nous avions déjà ce composant en delphi 7 sur le projet, et il n'y avait pas de soucis !
    Delphi 6 entreprise & interbase 6

    Bonne journée 8)

    Tout programme non trivial contient au moins un bug.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/03/2007, 14h56
  2. Problème de libération mémoire
    Par chrono23 dans le forum C++
    Réponses: 16
    Dernier message: 07/09/2006, 23h18
  3. Réponses: 3
    Dernier message: 14/03/2006, 05h19
  4. [COM] Libération mémoire
    Par MC2 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 13/01/2006, 16h15
  5. FIREBIRD + APPLI EN C : Problèmes de libération mémoire
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 16/09/2005, 09h07

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