Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di mvent
    Registrato dal
    Jun 2002
    Messaggi
    230

    [VB6] conoscere dimensioni del processo del programma.

    come si fa?

    ho fatto un programmino che mi fa delle ricerche nel web, gli dò una durata massima di ricerca.
    a volte però capita che il programma assorbe troppa memoria e si inchioda.

    ho bisogno di sapere come si monitorano le dimensioni del processo del programma, cosi che quando arrivo a certe dimensioni cerco di svuotarlo.


  2. #2

  3. #3
    Utente di HTML.it L'avatar di mvent
    Registrato dal
    Jun 2002
    Messaggi
    230
    grazie!

    in particolare segnalo questo esempio che risponde bene alla questione


    http://forum.masterdrive.it/visual-b...cazione-17942/



  4. #4
    Utente di HTML.it L'avatar di mvent
    Registrato dal
    Jun 2002
    Messaggi
    230
    non funziona però...mi dà sempre 20-30 Mb in più di quanto ha veramente il processo.
    sempre ammesso che il programma "gestione attività" di windows vista, che indica tutti i processi in corso, stabilisca correttamente le dimensioni dell'assorbimento Ram dei vari processi.

    questo è il codice usato:

    codice:
    questa sta nel modulo:
    Public Type PROCESS_MEMORY_COUNTERS
      cb As Long
      PageFaultCount As Long
      PeakWorkingSetSize As Long
      WorkingSetSize As Long
      QuotaPeakPagedPoolUsage As Long
      QuotaPagedPoolUsage As Long
      QuotaPeakNonPagedPoolUsage As Long
      QuotaNonPagedPoolUsage As Long
      PagefileUsage As Long
      PeakPagefileUsage As Long
    End Type
    Public PID As Long, hProc As Long, proc As PROCESS_MEMORY_COUNTERS
    Public Const PROCESS_TERMINATE = &H1
    Public Const VER_PLATFORM_WIN32_WINDOWS = 1
    Public Const PROCESS_QUERY_INFORMATION = 1024
    Public Const PROCESS_VM_READ = 16
    Public Const TH32CS_SNAPPROCESS = &H2
    
    Public Function ControllaUsoRam(HWND_Finestra As Long)
    Dim RETV As Long, RISULTATO As String
      RETV = GetWindowThreadProcessId(HWND_Finestra, PID)
      hProc = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, PID)
      RISULTATO = GetProcessMemoryInfo(hProc, proc, Len(proc))
      RISULTATO = "Uso Ram: " & AggiustaDimensioni(proc.WorkingSetSize)
      CloseHandle hProc
      ControllaUsoRam = RISULTATO
    End Function
    
    Public Function AggiustaDimensioni(DimBytes As Long) As String
      'da bytes in KB => bytes / 1024   =====   da bytes in MB => bytes / 1024 / 1024
      AggiustaDimensioni = FormatNumber(DimBytes / 1024 / 1024, 2, vbTrue, vbFalse, vbTrue) & " MB"
    End Function
    
    questa in una procedura di un form:
    lblUsoRAM.Caption = ControllaUsoRam(Me.HWND): lblUsoRAM.Refresh
    ho provato tutti i valori della struttura PROCESS_MEMORY_COUNTERS, ma addiritura gli altri sono anche più alti...
    dove sta l'inghippo?!

    :rollo:

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Non so per quale motivo tu voglia percorrere questa strada, che secondo me non ti porta da nessuna parte.

    Che tu riesca a vedere o meno che la memoria occupata dal tuo processo è abnorme a che ti serve? Lo sai già che è così.
    Per cui, in ogni caso, devi andare alla ricerca nel codice per scoprire dove ciò avvenga.

    Il perchè lo si sa già: si stanno usando strutture, oggetti, chiamate API, ecc. di cui non si rilasciano le risorse allocate.

    Per cui bisogna concentrarsi e fare un attento e meticoloso debug del codice.

    Anni fa ho dovuto affrontare una cosa analoga in un mio componente ActiveX DLL, e solo con un attento debug ho scoperto che dopo aver creato ed usato un font, poi dimenticavo di rilasciarlo, per cui continuava ad occupare memoria e, ad ogni chiamata, ne incrementava l'occupazione.


  6. #6
    Utente di HTML.it L'avatar di mvent
    Registrato dal
    Jun 2002
    Messaggi
    230
    Originariamente inviato da gibra
    Non so per quale motivo tu voglia percorrere questa strada, che secondo me non ti porta da nessuna parte.

    Che tu riesca a vedere o meno che la memoria occupata dal tuo processo è abnorme a che ti serve? Lo sai già che è così.
    Per cui, in ogni caso, devi andare alla ricerca nel codice per scoprire dove ciò avvenga.

    Il perchè lo si sa già: si stanno usando strutture, oggetti, chiamate API, ecc. di cui non si rilasciano le risorse allocate.

    Per cui bisogna concentrarsi e fare un attento e meticoloso debug del codice.

    Anni fa ho dovuto affrontare una cosa analoga in un mio componente ActiveX DLL, e solo con un attento debug ho scoperto che dopo aver creato ed usato un font, poi dimenticavo di rilasciarlo, per cui continuava ad occupare memoria e, ad ogni chiamata, ne incrementava l'occupazione.

    oh bene! come si rilascia la memoria occupata? ad esempio nel mio caso: ho un form con un oggetto webbrowser che gira per il web. è per via del fatto che visita molte pagine che la memoria assorbita dal processo aumenta in continuazione?
    nel codice della routine di ricerca a volte uso delle query, ma queste le chiudo e le scarico con
    set recordset = nothing
    si fa cosi?

    per scaricare la memoria occupata dall'oggetto webbrowser? e quella occupata dalle API (ne uso una ventina)?

  7. #7
    Utente di HTML.it L'avatar di mvent
    Registrato dal
    Jun 2002
    Messaggi
    230
    allora ho trovato come:
    - scaricare la memoria delle variabili oggetto
    - scaricare l'oggetto webbrowser

    mi rimane da capire come scaricare le API usate e di sapere se oltre a queste cose ce ne sono altre da rilasciare dalla memoria.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.