2013-04-14 6 views
0

mon application est juste s simple sendkeys. mon problème est quand je cours mon application il a utilisé environ 55-65k utilisation de la mémoire, puis quand je l'ai réduit à la barre d'état système, il descend soudainement à environ 1-3k utilisation de la mémoire, puis quand je le restaure, il s'élève à environ 6-8k d'utilisation de la mémoire. Ma question est de savoir comment puis-je réduire l'utilisation de la mémoire, même si je n'ai pas minimisé mon application?Utilisation de la mémoire de vb.net

REMARQUE: j'essaie d'attendre environ 3 minutes pour voir si mon application va réduire son utilisation de la mémoire, car je pense que c'est juste en chargeant un composant. mais je doesnt, je m'assieds sur 55-65k si je ne l'ai pas minimisé.

Voici mon code:

Imports System.Runtime.InteropServices 
Imports System.Threading 
Public Class Form1 
    Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Integer) As Integer 
    Public Declare Sub keybd_event Lib "user32" Alias "keybd_event" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer) 

    Private Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow"() As IntPtr 
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr 

    Private SearchWindow As String 
    Public Const vbKeyQ = 81 
    Public Const vbKeyW = 87 
    Public Const vbKeyE = 69 
    Public Const vbKeyR = 82 
    Public Const KEYEVENTF_KEYUP = &H2 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     SearchWindow = "MU" 
     Timer1.Enabled = True 
    End Sub 

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
     If Control.IsKeyLocked(Keys.CapsLock) Then 
      Dim ForeGroundHwnd As IntPtr = GetForegroundWindow 
      Dim MySearchWinow As IntPtr = FindWindow(Nothing, SearchWindow) 
      If ForeGroundHwnd = MySearchWinow Then 
       If rbQ.Checked = True Then 
        keybd_event(vbKeyQ, 0, 0, 0) 
        keybd_event(vbKeyQ, 0, KEYEVENTF_KEYUP, 0) 
       ElseIf rbW.Checked = True Then 
        keybd_event(vbKeyW, 0, 0, 0) 
        keybd_event(vbKeyW, 0, KEYEVENTF_KEYUP, 0) 
       ElseIf rbE.Checked = True Then 
        keybd_event(vbKeyE, 0, 0, 0) 
        keybd_event(vbKeyE, 0, KEYEVENTF_KEYUP, 0) 
       ElseIf rbR.Checked = True Then 
        keybd_event(vbKeyR, 0, 0, 0) 
        keybd_event(vbKeyR, 0, KEYEVENTF_KEYUP, 0) 
       End If 
      End If 
     End If 
    End Sub 

    Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize 
     Try 
      If Me.WindowState = FormWindowState.Minimized Then 
       Me.WindowState = FormWindowState.Minimized 
       NotifyIcon1.Visible = True 
       Me.Hide() 
      End If 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     End Try 
    End Sub 

    Private Sub NotifyIcon1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseDoubleClick 
     Try 
      Me.Show() 
      Me.WindowState = FormWindowState.Normal 
      NotifyIcon1.Visible = False 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     End Try 
    End Sub 

    Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click 
     Me.Close() 
    End Sub 
End Class 

Répondre

0

Il est normal pour une application d'utiliser la mémoire de cette façon.

Lorsque vous réduisez l'application, le système envoie un signal au gestionnaire de mémoire pour essayer de libérer autant de mémoire que possible.

Normalement, une application n'essaiera pas de minimiser la mémoire allouée, car c'est juste une perte de temps. Avoir beaucoup de mémoire libre ne rend pas un ordinateur plus rapide, au contraire, il ferait beaucoup de travail sans raison. Si vous avez besoin de la mémoire, le gestionnaire de mémoire essaiera de la libérer. Pour être complet, je devrais mentionner que pourrait faire que l'application utilise moins de mémoire en forçant des collectes de place, mais cela est inutile, et généralement considéré comme une mauvaise pratique.

1

quand je minimisais à la barre système, il va soudainement à environ 1-3k utilisation de la mémoire

Il est clair que vous êtes en cours d'exécution sur un système d'exploitation très ancienne. Vous ne mesurez pas l'utilisation de la mémoire du tout, vous regardez le ensemble de travail de votre programme. Le nombre de pages de mémoire virtuelle qui sont mappées dans la RAM. Sur un ancien système d'exploitation, comme XP, le gestionnaire de mémoire supprime agressivement l'ensemble de travail d'un processus lorsque sa fenêtre principale est réduite. Une fonctionnalité qui a été conçue pour compresser beaucoup de processus dans très peu de RAM. XP nécessite seulement 64 mégaoctets.

Il ne vient pas gratuitement, il faut du temps pour que le processus soit réactif quand il reçoit le premier plan, les pages qui ont été mappées doivent être remises en page. Ce ne sera d'abord que les pages sont vraiment nécessaires par votre code, c'est pourquoi l'augmentation n'est pas si grande. Les versions modernes de Windows ne dérangent plus avec cette fonctionnalité, ils peuvent compter sur des machines ayant suffisamment de RAM ces jours-ci. Windows réduit uniquement l'ensemble de travail d'un programme lorsqu'il doit faire de la place pour d'autres processus. Faire un travail qui n'est pas nécessaire n'est qu'un effort inutile.

En réalité, vous utilisez beaucoup plus de mémoire que ça. Mémoire virtuelle. Cela ne coûte rien, c'est virtuel. Compromettre votre code pour réduire quelque chose qui ne coûte rien n'a aucun sens. Et 65 Ko de mémoire virtuelle sont des cacahuètes, seulement 3% de ce qui est disponible pour un processus.

Un livre comme Windows Internals est un bon pour en savoir plus sur la gestion de la mémoire sous Windows.