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

wxPython Discussion :

Gestion de la memoire


Sujet :

wxPython

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut Gestion de la memoire
    Bonjour a tous,

    Petite question :

    Pourquoi quand on ferme une Fenêtre enfant, la mémoire utiliser pour la création n'est pas restaurer automatiquement.

    Je m'explique : dans ma fenêtre principale j'ai la possibilité d'ouvrir d'autre fenêtre (via showmodal), à la création de la fenêtre de la mémoire est allouer au programme (normal) par contre à la fermeture cette mémoire n'est pas récupérer par le système j'utilise un destroy pour quitter la fenêtre.


    Soit je dev mal ce qui est fort probable. Soit c'est phénomène normal (j'y crois pas trop)

    Merci pour vos réponses.

    Ha oui !! je suis sous windows XP pro avec python 2.6 et wx.2.8.10.1.

    Merci d'avance

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    destroy() (et cela est de même en Tkinter) ne détruit pas l'objet.

    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
    #!/usr/bin/env python
     
    import wx
     
    class wxmyFrame(wx.Frame):
        def __init__(self, *args, **kwargs):
            wx.Frame.__init__(self, *args, **kwargs)
            self.cree_bouton()
     
        def cree_bouton(self):
            self.button1 = wx.Button(self, label="Quitter")
            self.button1.Bind(wx.EVT_BUTTON, self.onpress)
     
        def onpress(self, event):
    	self.Destroy()
     
    class wxtest(wx.App):
        def OnInit(self):
            frame = wxmyFrame(None, title="Test")
            frame.Show()
            self.SetTopWindow(frame)
            return True
     
    if __name__ == "__main__":
        app = wxtest()
        app.MainLoop()
     
        print id(wxmyFrame)
     
        del(wxmyFrame)
     
        print id(wxmyFrame)
    @+

    Edit : Voila ce que cherchais.

    Destroy(self)

    Destroys the window safely. Frames and dialogs are not destroyed immediately when this function is called -- they are added to a list of windows to be deleted on idle time, when all the window's events have been processed. This prevents problems with events being sent to non-existent windows.

    Returns True if the window has either been successfully deleted, or it has been added to the list of windows pending real deletion.


    Il ne reste plus qu'a attendre le ramassage.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    L'autre question est "comment regardez vous la mémoire consommée"?

    Le fait est que la destruction d'objets rendra rarement l'espace virtuel déjà alloué - il pourra être alloué à autre chose. Et pour ce qui est de la 'RAM', c'est encore une autre histoire.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut
    Merci PauseKawa pour ta réponse aussi rapide et le bout de code.

    Après comparaison il me semble que je détruit ma fenêtre correctement non ??
    Ex:

    J'ai une taskbar dans laquelle j'ai des menus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def MyPrefsMenu(self):
            menubar = wx.MenuBar(style = wx.MB_DOCKABLE)
            prefs = wx.Menu()
            aide = wx.Menu()
            prefs.Append(101, 'Gestion Bandeau', 'Gestion Bandeau')
            prefs.Append(102, 'Gestion Menu', 'Gestion du Menu')
            prefs.Append(103, 'Gestion Commande', 'Gestion Commande')
            aide.Append(201, 'A propos', 'A propos')
            menubar.Append(prefs, 'Preferences')
            menubar.Append(aide, 'Aide')
            self.parent.SetMenuBar(menubar)
            self.parent.Bind(wx.EVT_MENU, self.bandeau.ModifBandeau, id=101)
            self.parent.Bind(wx.EVT_MENU, self.menu.ModifMenu, id=102)
            self.parent.Bind(wx.EVT_MENU, self.commande.ModifCommande, id=103)
    voici la fonction ModifBandeau (seul les trois dernières lignes sont intéressantes)

    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
    def ModifBandeau(self):
            self.modif_frame = wx.Dialog(self.parent, -1, size = self.dic_prefs["chframesize"])
            self.modif_frame.SetTitle(self.dic_prefs["chbandeautitre"])
            self.modif_frame.SetBackgroundColour(self.mod_bg_color.RgbColor(self.dic_prefs["chframebgcolor"]))
            text = """
            Cet ecran vous permet de modifier l'encart reserver au logo ainsi 
            que celui du titre.
            """
            af_text = wx.StaticText(self.modif_frame, -1, text, style=wx.ALIGN_CENTRE)
            ligne = wx.StaticLine(self.modif_frame, -1)
     
            gs = wx.GridSizer(2, 4, 3, 3)
            for i in self.change_bt_dic.keys():
                bt = wx.Button(self.modif_frame, i, self.change_bt_dic[i]["nom"])
                bt.SetBackgroundColour(self.mod_bg_color.RgbColor(self.change_bt_dic[i]["btcolor"]))
                gs.Add(bt, 1, wx.EXPAND)
            self.modif_vbox = wx.BoxSizer(wx.VERTICAL)
            self.modif_vbox.Add(af_text, 0, wx.EXPAND)
            self.modif_vbox.Add(ligne, 0, wx.EXPAND)
            self.modif_vbox.Add(gs, 1, wx.EXPAND)
            self.modif_frame.SetSizer(self.modif_vbox)
            self.modif_frame.Bind(wx.EVT_BUTTON, self.changecolor, id=20)
            self.modif_frame.Bind(wx.EVT_BUTTON, self.changecolor, id=21)
            self.modif_frame.Bind(wx.EVT_BUTTON, self.changelogo, id=22)
            self.modif_frame.Bind(wx.EVT_BUTTON, self.changefont, id=23)
            if self.modif_frame.ShowModal() == wx.ID_EXIT:
                self.modif_frame.Destroy()
    Pour répondre à wiztricks, j'utilise simplement le gestionaire des taches (l'onglet processus) et je regarde l'evolution en fonction de l'utilisation. En comparant avec la fermeture de widget comme celui qui permet de gerer les fonts qui lui en se fermant libere la mémoire.

    Merci pour vos reponses

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour

    Comme le dit wiztricks Python assigne un espace mémoire pour les objets (de taille différente suivant le type). Tu ne gère pas ce comportement.
    Même dans l'exemple du del au dessu cela ne fait qu'enlever la référence dans l'espace de nom. L'objet reste jusqu'au passage du ramasse miette.
    Son rôle au garbage collector consiste à identifier puis à libérer les zones de mémoires inutilisées par l'application. Je dit bien libérer et cela reviens à ce que dit wiztricks : Le fait est que la destruction d'objets rendra rarement l'espace virtuel déjà alloué - il pourra être alloué à autre chose. Pas sur que Python le libère pour le système.
    (Edit: Si quelqu'un a des infos...n'hésitez pas )

    Un exemple pour le del :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    patrice@Zeus:~$ /usr/bin/python
    Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) 
    [GCC 4.3.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import wx
    >>> del wx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    patrice@Zeus:~$ ps -Al | grep python
    0 S  1000  3784  3579  0  80   0 -   981 wait   ?        00:00:00 python
    0 S  1000  3861  3784  0  80   0 -  5034 wait   ?        00:00:00 python
    0 S  1000  3891  3890  0  80   0 -  7086 poll   ?        00:00:00 python2.6
    0 S  1000  6079  5393  0  80   0 -  1600 select pts/0    00:00:00 python >  /usr/bin/python
    patrice@Zeus:~$ ps -Al | grep 6079
    0 S  1000  6079  5393  0  80   0 -  8340 select pts/0    00:00:00 python > import wx
    patrice@Zeus:~$ ps -Al | grep 6079
    0 S  1000  6079  5393  0  80   0 -  8340 select pts/0    00:00:00 python > après le del
    Même dans le cadre d'un modification d'un objet (je ne parle pas d'une nouvelle affectation (=) qui ne fais qu'écraser le nom dans le namespace mais n'efface pas l'objet nommé auparavant) je ne pense pas que l'espace mémoire soit libéré pour le système.

    La libération d'objets externes (les fonts ?) ? A voir.


    Est il possible d'avoir le code du widget qui permet de gérer les fonts (bien que je soit nul en wx...) pour se faire une idée ?

    @+

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Je viens de relire le sujet et il me semble qu'il y as une erreur :

    Pour mes réponses et celles de wiztricks c'est du Python.
    Nous somme en présence d'un wrapper.

    Qu'en est il de la gestion (delete) des objets wx ?

    Le OnExit() semble libérer la mémoire (au niveau système ?) mais je ne pense pas que ton destroy() le fasse (voir le safely).

    Un pro de wx pour répondre ?

    Bon code

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    C'est un problème à dimensions multiples:
    - la mémoire physique nécessaire pour que çà tourne bien,
    - la mémoire "virtuelle" du processus qui héberge la machine virtuelle Python
    - le garbage collector GC Python qui libère la mémoire (virtuelle) occupée
    - la capacité du GC a compacter les objets utilisés dans l'espace mémoire (virtuelle) alloué
    - l'intérêt "limité" de rendre la mémoire virtuelle inoccupée - ce n'est que de la mémoire virtuelle-.

    Historiquement, les systèmes 32 bits offrent un espace virtuel "plat".
    Le processus alloue la mémoire dans un tableau qui a une adresse basse et une adresse haute fixes. Comme nous avons deux zones mémoires critiques que sont la pile d'exécution et le tas dans lequel est allouée dynamiquement la mémoire pour les différents objets, difficile d'être "inventif".

    Il faut attendre les OS 64 bits pour avoir un espace mémoire "hiérarchique" et la possibilité d'avoir d'autres zones à utiliser.
    Mais le sujet pour intéressant qu'il soit est trop compliqué pour qu'il soit "utile" d'embêter les programmeurs avec ces détails: le garbage collector se charge de tout çà...
    Note: le GC est sans doute un des points qui ont fait le succès de Java par rapport à des C/C++
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut
    Bonjour,

    Tout d'abord merci à tous pour vos réponses. Je me suis tromper sur le widget wx qui à le comportement que je voudrait reproduire, ce n'est pas celui de gestion des Fonts mais wx.FileDialog qui ouvre une fenêtre et permet de choisir un fichier. Et pour le code toute le monde l'a puisque c'est inclut dans wx.

    J'ai bien compris le la philosophie du ramasse miette.
    Sinon peut être que je me casse la tête pour pas grand chose... Je m'explique. Ma crainte était d'avoir une appli qui n' arrête de grossir et qui final bouffe toute la RAM. Effectivement j'ai constater qu' en réduisant puis en ré-ouvrant l'appli les compteurs se remette à zéro (je passe d'une utilisation d'environ 22Mo (20 Mémoire allouer lors de démarrage de l'application) à 1Mo.

    Bref ca me prends la tête, j'ai l'impression de tourner en rond sur un faux problème. Ou alors je suis passé à conté de qquechose dans vos réponses.


    Si vous avez un exemple simple .... je suis preneur.

    D'avance merci

Discussions similaires

  1. Gestion de la memoire
    Par deeal dans le forum C++/CLI
    Réponses: 8
    Dernier message: 14/11/2006, 14h20
  2. Gestion de la memoire central d'un PC
    Par Bass_Room dans le forum C
    Réponses: 7
    Dernier message: 22/10/2006, 15h02
  3. gestion de la memoire en java
    Par jojob dans le forum Langage
    Réponses: 15
    Dernier message: 16/10/2006, 17h04
  4. Gestion de la mémoire.
    Par nicolas_faf dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 27/03/2006, 16h58
  5. [JVM]Gestion de la mémoire
    Par Crypt dans le forum Général Java
    Réponses: 20
    Dernier message: 31/12/2005, 14h33

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