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

Windows Forms Discussion :

Comment liberer la mémoire vive svp ?


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut Comment liberer la mémoire vive svp ?
    Bonjour,

    J'ai fait un petit programme pour arreter plusieurs processus de Windows afin de liberer la RAM d'une vielle bécane. Explorer est inlcu ds les process que je stop. Pour relancer les process précédements arretés en un click de souris, mon programme ne se ferme pas à la fin de toute la procédure, mais ouvre une autre form qui propose de relancer les processus arrétes. Le problème est que mon prog occupe alors 13 Mo de RAM.

    Je suis débutant, mais il me semble que la solution soit du coté d'une commande nommée "Dispose()"
    Malheuresement, je ne sais pas comment l'utiliser...

    Donc, un petit coup de main svp pour finir mon prog serait le bien venu.
    Merci d'avance.
    A+

  2. #2
    Membre Expert Avatar de LaChips
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 109
    Par défaut
    Bonjour,
    La méthode .Dispose() est utilisé au moment ou tu détruis un objet instancié, afin de libérer la mémoire qu'il utilise.
    Tu dois appeler cette méthode quand tu n'utilises plus un objet de ton programme...

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    pour 10 euros t'as 512Mo de ram sur ebay
    c'est plus simple que de faire l'apprenti sorcier à tuer les processus


    sinon pour dispose, c'est une fonction qui existe sur pas mal d'objets du framework enfin sur ceux qui utilisent des ressources non managées, de l'OS par exemple

    il est fortement conseillé d'appeler la méthode dispose sur tous les objets la possédant
    par exemple sur une fenetre, si tu instancie un New Image et que tu fermes ta fenetre, l'objet a de forte chance de rester en mémoire longtemps

    j'avais fait un programme de test, avec un timer qui faisait un new system.Drawing.bitmap (500,500) toutes les 500ms
    et résultat au bout de quelques secondes, mon prog occupait 800Mo de ram

    pour les fenetre dispose est appelé automatiquement, et au passage la fenetre appelle dispose sur tous ses controles qui appelent dispose sur tous leurs controles

    donc là ou tu peux gagner c'est sur tes objets dans ton code
    donc au moment de désinstancier un objet, il faut que tu tapes le code qui désinstancie les objets qu'il a créé
    il est parfois possible d'overrider Dispose(disposing as boolean) et de mettre son code de desinstanciation puis de rappeler mybase.Dispose
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    il ne faut pas non plus oublier qu'il y a le GC ( ramasse miettes ) qui fait son petit ménage des objets non utilisés de manière aléatoire. On ne peut pas affirmer avec certitudes qu'après un Dispose l'objet managé ai véritablement libéré la mémoire qu'il utilisait ( pour les resources natives ça marche, mais pour un byte[] de 8 Mo par exemple ça ne marchera pas ) celà conduit parfois a des situations tordues : par exemple, on lance un programme WinForm simple, il occupe 50 Mo, on le réduit dans la barre des taches : 8 Mo, on le restore 13 Mo ...
    Tu peut donc éssayer GC.Collect() pour forcer le GC à faire le ménage tout de suite mais là encore c'est assez complexe de savoir quelles seront les objets qui seront effectivement supprimés ...

  5. #5
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    pourais-tu me donner un exemple stp ? y'a pas mieux pour comprendre je trouve.

    Sinon, j'ai essayé d'ajouter la commande "Dispose()" mais ça ne change de rien. A l'évidence, je ne l'utilise pas correctement. En exemple, un bout de mon code.
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Private Sub Button_Optimiser_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Optimiser.Click
            Me.DialogResult = System.Windows.Forms.DialogResult.OK
     
            Button_Optimiser.Enabled = False
            Button_Optimiser.BackColor = Color.Empty
            Button_Fermer.Enabled = False
            Button_NormalConfig.Visible = False
            Button_ExplorerSTART.Visible = False
     
            Label_EnCours.Visible = True
            Label_Optimiser.Visible = False
     
            Dim TerminerProcessus() As Process = Process.GetProcesses 'récupère la liste des processus de Windows (Attention, ce sont des tableaux)
            For x As Integer = 0 To UBound(TerminerProcessus) 'Recherche ds la liste (en boucle)
     
                If TerminerProcessus(x).ProcessName.ToString = "cmd" Then
                    TerminerProcessus(x).Kill()
                End If
     
                ' TouchPad ----------------------------------------------------
                If TerminerProcessus(x).ProcessName.ToString = "Apoint" Then
                    TerminerProcessus(x).Kill()
                End If
                If TerminerProcessus(x).ProcessName.ToString = "ApntEx" Then
                    TerminerProcessus(x).Kill()
                End If         
                ' et les autres process...
            Next
     
            TimerOptimiser.Interval = (15000)
            TimerOptimiser.Start()
        End Sub
     
    Private Sub TimerOptimiser_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerOptimiser.Tick
     
            Shell("cmd.exe /k taskkill /F /IM explorer.exe", AppWinStyle.Hide)
     
            System.Threading.Thread.Sleep(3000) ' y'a pas mieux pour attendre la fin ?
     
            Dim TerminerProcessus() As Process = Process.GetProcesses
            For x As Integer = 0 To UBound(TerminerProcessus)
                If TerminerProcessus(x).ProcessName.ToString = "cmd" Then
                    TerminerProcessus(x).Kill()
                End If
            Next
     
            TimerOptimiser.Stop()
     
            System.Threading.Thread.Sleep(3000)
     
            'Me.WindowState = FormWindowState.Normal
     
            Button_Optimiser.Dispose()
            Button_NormalConfig.Dispose()
            Button_ExplorerSTART.Dispose()
            Button_Fermer.Dispose()
            Panel_Buttons.Dispose()
            Panel_Labels.Dispose()
     
            'Me.Dispose()
     
            'My.Application.ApplicationContext.MainForm.Dispose()
            'Me.Finalize
            FormMini.Show()
            Me.Close()
        End Sub

  6. #6
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par arnomedia
    Shell("cmd.exe /k taskkill /F /IM explorer.exe", AppWinStyle.Hide)

    System.Threading.Thread.Sleep(3000) ' y'a pas mieux pour attendre la fin ?
    Oui, utilise plutot les fonctions de la class System.Diagnostics.Process. Il y a une méthode WaitBidule pour attendre la fin de l'exécution d'un programme.


    Citation Envoyé par arnomedia
    Button_Optimiser.Dispose()
    Button_NormalConfig.Dispose()
    Button_ExplorerSTART.Dispose()
    Button_Fermer.Dispose()
    Panel_Buttons.Dispose()
    Panel_Labels.Dispose()
    Essaye de rajouter GC.Collect() après ...

  7. #7
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    pour les RAM à pas cher sur e-bay, oui peut etre ? mais c pas trop le but. Disons que ce prog est un pretexte pour continuer à apprendre le VB

    En tout cas merci pour vos réponse. Par contre, si qqc pouvait me donner un exemple... car je ne maitrise pas bien le vocabulaire spécifique et du coup, je n'ai pas tout compris.

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    deja j'ai dit que la fenetre s'occupait de disposer ses controles donc pas besoin de le faire toi meme avant
    GC = garbage collector
    c'est un processus en tache de fond qui s'occupe de libérer la mémoire quand ca le chante
    dans une grande appli qui tourne pendant des heures sur un pc avec plein de ram, ne pas faire GC.collect pendant que l'utilisateur est devant, sinon il sera pas trop content

    sinon apprendre vb avec un programme dans ce genre n'est pas le mieux je pense
    tu peux apprendre par ici : http://plasserre.developpez.com/vsommair.htm
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    je consulte ce lien régulièrement, c 'est une mine d'or pour moi ! merci qd m. Sinon, j'en suis à mon 3eme petit prog et je compte bien terminer celui-ci, d'autant que cette difficulter devrait etre la dernière que je rencontre pour ce prog puisqu'il est "terminé".

    Donc, un exemple ?

Discussions similaires

  1. Comment augmenter la mémoire vive allouée à Python?
    Par syrius31 dans le forum Général Python
    Réponses: 19
    Dernier message: 28/03/2011, 16h20
  2. Comment reduire la consommation de la mémoire vive
    Par souarit dans le forum Débuter
    Réponses: 3
    Dernier message: 27/12/2008, 20h37
  3. Utilisation de la mémoire vive....
    Par Neilos dans le forum Windows
    Réponses: 9
    Dernier message: 24/11/2003, 11h09
  4. Objet et liberation de mémoire ...
    Par Mouss26 dans le forum Langage
    Réponses: 4
    Dernier message: 17/03/2003, 12h12

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