Programme gourmand en mémoire, pourquoi ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
GG
Messages : 239
Inscription : jeu. 09/déc./2004 12:23

Programme gourmand en mémoire, pourquoi ?

Message par GG »

Bonjour à tous,

Je souhaiterais vous solliciter sur le bout de code que j'ai développé et qui me cause des soucis :

1/ Ce programme ouvre une fenêtre principale
2/ Clic droit puis "Ajouter"
3/ Une nouvelle fenêtre s'ouvre. En l'état le programme ne doit pas prendre plus de 4 Mo en mémoire (voir dans le gestionnaire de taches, onglet processus)

Mais si on décommente, dans la procédure ajout_client au moins une des 8 lignes commentées, mon programme alloue une quantité de mémoire supérieure à 70 Mo.

a) Constatez vous ce problème ?
b) Si oui, a quoi cela est-il du ? Comment peut on résoudre ce problème ?

D'avance, mille merci de vos réponses / conseils.

Cf code ci dessous :

Code : Tout sélectionner

Structure Client
  nom.s
  ip.s
  port.s
EndStructure

NewList Client.Client()
#Fen_1=0
#Fen_2=1
#Select_ini=0
version1 = 0
version2  = 0
version3 = 7
Flag=0
#WindowWidth  = 500
#WindowHeight = 400

Procedure Ajout_client(value)
flag2=0
Fen_Aj=OpenWindow(32,200,200,250,250,#PB_Window_WindowCentered |#PB_Window_SystemMenu,"Ajout d'un client")
CreateGadgetList(WindowID(32))
;TextGadget(Fen_Aj+1,35,10,130,40,"Nom du nouveau client")
;StringGadget(Fen_Aj+2,30,30,130,20,"")
;TextGadget(Fen_Aj+3,50,60,100,40,"Adresse IP du client")
;IPAddressGadget(Fen_Aj+4,30,90,130,20)
;TextGadget(Fen_Aj+5,50,120,100,40,"Port du patio_server")
;StringGadget(Fen_Aj+6,30,150,130,20,"")
;ButtonGadget(Fen_Aj+7,50,200,40,20,"OK")
;ButtonGadget(Fen_Aj+8,120,200,50,20,"Annuler")
Repeat
eventid3=WaitWindowEvent()
If eventid3=#PB_Event_Gadget
  Select EventGadgetID()
    Case (Fen_Aj+7); On valide
            CloseWindow(32)
    Case (Fen_Aj+8); On annule
    flag2=1
    eventid3= #PB_EventCloseWindow
  EndSelect
EndIf
Until Eventid3=  #PB_EventCloseWindow
CloseWindow(32)
EndProcedure

;- Début du programme

If CreatePopupMenu(12)
  MenuItem(13,"Ajouter")  
EndIf
If OpenWindow(#Fen_1, 200, 120, #WindowWidth, #WindowHeight, #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered , "XXX "+Str(version1)+"."+Str(version2)+Str(version3)) 
  clients=0
        AddElement(Client());
        Client()\nom="Test"
        Client()\ip="192.168.1.1"
        Client()\port="23"
  If CreateGadgetList(WindowID())  
    fenetre=WindowID()
    ListIconGadget(1,50,60,380,250,"Clients",359)
    ResetList(Client())
    While NextElement(Client())
      AddGadgetItem(#Fen_2,-1,Client()\nom+" [ "+Client()\ip+" ; "+Client()\port+" ]")
    Wend 
  EndIf
  Repeat 
    EventID=WaitWindowEvent()
    Debug eventid    
    If EventID=#PB_EventGadget 
    Select EventGadgetID()
      Case 1
      Select EventType()
        Case #PB_EventType_LeftDoubleClick
        choix=GetGadgetState(1)
        If choix <>-1 
          CloseWindow(#Fen_1)
          Flag=1 
        EndIf 
        Case #PB_EventType_RightClick
          DisplayPopupMenu(12,fenetre)
      EndSelect
    EndSelect
    EndIf 
    If EventID=#PB_EventMenu
    choix=GetGadgetState(1)
      Select EventMenuID() 
        Case 13 ; Ajout d'un client
          Ajout_Client(choix)        
      EndSelect
    EndIf 
  Until EventID=#PB_EventCloseWindow Or Flag=1
  EndIf
PureBasic 6.03 - Windows 11 22H2 (64 bits)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

A moins d'une erreur de ma part, ça me semble normal!

Pour créer tes gadgets, tu ajoutes 1 au handle de la fenêtre!

Crée une GadgetList() normale, comme pour l'autre fenêtre, et ça devrait résoudre le problème
GG
Messages : 239
Inscription : jeu. 09/déc./2004 12:23

Message par GG »

Non, cela correspond au numéro de gadget par objet. Ce sont les gadget ID de chacun des objets graphiques.
Dernière modification par GG le mar. 18/oct./2005 14:34, modifié 1 fois.
PureBasic 6.03 - Windows 11 22H2 (64 bits)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Et puis tu devrais utiliser les énumerations, c'est quand même plus pratique

Enumeration
#MonGadget_1
#MonGadget_2
#MonGadget_3
#Etc...
EndEnumeration
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

GG a écrit :Non, cela correspond au numéro de gadget par objet. Ce sont les gadget ID de chacun des objets graphiques.
OpenWindow() retourne le Handle de la fenêtre
Fen_Aj=OpenWindow(32.....

Donc, quand tu fais Fen_Aj + 1, tu augmentes le handle de 1, pas l'index de l'objet que tu crée
GG
Messages : 239
Inscription : jeu. 09/déc./2004 12:23

Message par GG »

Merci infiniment Chris, cela venait du handle. Mea Culpa.

Par contre, comment se fait-il que le nombre hérité par le gadgetid puisse influer de la sorte ?
PureBasic 6.03 - Windows 11 22H2 (64 bits)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

C'est pas trop à moi de demander ça!

Il y a certainement des gens plus compétents qui te répondront :wink:
GG
Messages : 239
Inscription : jeu. 09/déc./2004 12:23

Message par GG »

En tout cas, merci beaucoup pour ton intervention.
Effectivement, si quelqu'un a un début d'explication sur ce point, je suis preneur, par curiosité...
PureBasic 6.03 - Windows 11 22H2 (64 bits)
Répondre