Condividi:        

Re: memoria usata

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Re: memoria usata

Postdi Anthony47 » 07/10/23 16:22

IN RISPOSTA AL QUESITO POSTO DA UN UTENTE CHE POI SI E' PENTITO DI AVER FATTO LA DOMANDA E HA PRETESO LA CANCELLASSI

Nelle vecchie versioni esisteva la funzione AMBIENTE.INFO che aveva come possibili parametri, tra l'altro, "memdispo", "mem_usata" e "mem_tot"; ma da XL2010 (forse anche 2007) sono parametri non più gestiti.
Non ti puo' bastare il dato fornito da TaskManager /Gestione attività (si avvia tramite Contr-Alt-Canc), scheda Processi?

Comunque qualcosa si puo' estrarre lavorando sui processi di sistema.
Ad esempio questa Funzione:
Codice: Seleziona tutto
    Dim isIn As Boolean
    Dim objWMIService, objProcess, colProcess
    Dim strComputer, strList
'
    strComputer = "."
'
    Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
   
    Set colProcess = objWMIService.ExecQuery _
    ("Select * from Win32_Process")
   
    For Each objProcess In colProcess
        If CBool(InStr(1, objProcess.Name, ProcName, vbTextCompare)) Then
            IsProcessRunning = True
            Debug.Print ProcName & " Running at " & Format(Now, "mm-ss")
            Debug.Print "Size (MB): " & Format(objProcess.WorkingSetsize / 1000000, "0.000")
'            Debug.Print objProcess.PercentProcessorTime
            isIn = True
        End If
    DoEvents
    Next
    If isIn = False Then
        Debug.Print ProcName & " not running " & Format(Now, "mm-ss")
    End If
    Debug.Print
End Function

Va messa in un modulo standard del vba e poi puo' essere richiamata col nome del processo da monitorare; es
Codice: Seleziona tutto
ProcessInfo ("winword.exe")


Al mommento la funzione scrive il risultato all'interno della "finestra Immediata" del vba; tipo
Codice: Seleziona tutto
winword.exe Running at 16:31:35
Size (MB): 72,942
winword.exe Running at 16:31:35
Size (MB): 727,724

Qui mi sta dicendo che ci sono in esecuzione due processi Winword che occupano circa 73 e 727 Mbyte

E' opportuno che la function non venga richiamata in rapida successione, perche' consuma abbastanza cpu e tempo per completarsi.

E' utile sapere che il codice puo' essere utilizzato anche all'interno del vba di word; ad esempio, inserire questo codice in un nuovo (vuoto) Modulo standard di un documento word:
Codice: Seleziona tutto
#If VBA7 Then
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Sub GimmeInfo()
Do
    ProcessInfo ("excel.exe")
    Sleep 2000
    DoEvents
Loop
End Sub


Private Function ProcessInfo(ByVal ProcName As String) As Boolean
    Dim isIn As Boolean
    Dim objWMIService, objProcess, colProcess
    Dim strComputer, strList
'
    strComputer = "."
'
    Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
   
    Set colProcess = objWMIService.ExecQuery _
    ("Select * from Win32_Process")
   
    For Each objProcess In colProcess
        If CBool(InStr(1, objProcess.Name, ProcName, vbTextCompare)) Then
            IsProcessRunning = True
            Debug.Print ProcName & " Running at " & Format(Now, "hh:mm:ss")
            Debug.Print "Size (MB): " & Format(objProcess.WorkingSetsize / 1000000, "0.000")
'            Debug.Print objProcess.PercentProcessorTime
            isIn = True
        End If
    DoEvents
    Next
    If isIn = False Then
        Debug.Print ProcName & " not running " & Format(Now, "hh:mm:ss")
    End If
    Debug.Print
End Function

Eseguendo poi la Sub GimmeInfo ogni 2 sec verrà controllato lo stato del processo excel.exe; ad esempio, caricando il famoso file che non so come si comporta sul tuo pc e lanciando la sua Sub Avvia, ho ottenuto (a distanza di 60 secondi):

Codice: Seleziona tutto
excel.exe Running at 16:47:53
Size (MB): 587,137
excel.exe Running at 16:47:53
Size (MB): 62,644

excel.exe Running at 16:47:58
Size (MB): 664,150
excel.exe Running at 16:47:58
Size (MB): 62,628

excel.exe Running at 16:48:00
Size (MB): 706,302

[.........]

excel.exe Running at 16:48:54
Size (MB): 1891,354
excel.exe Running at 16:48:54
Size (MB): 61,034

excel.exe Running at 16:48:56
Size (MB): 1907,292
excel.exe Running at 16:48:56
Size (MB): 61,034

Cioe' l'occupazione di Excel e' passata da circa 650 a circa 1960 MB man mano che la macro scriveva altre colonne da 1 Mill di righe con i dati delle combinazioni calcolate

Ricorda che nella finestra vba vengono visualizzate circa 200 righe, poi le righe piu' vecchie vengono scartate per far posto a quelle nuove.
Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19228
Iscritto il: 21/03/06 16:03
Località: Ivrea

Sponsor
 

Re: memoria usata

Postdi Anthony47 » 08/10/23 16:01

Comunque qualcosa si puo' estrarre lavorando sui processi di sistema.
Ad esempio questa Funzione:
Mi accorgo solo ora che nel codice pubblicato manca la prima riga! :oops:
Codice: Seleziona tutto
Private Function ProcessInfo(ByVal ProcName As String) As Boolean                  '<--- MANCAVA questa riga
    Dim isIn As Boolean
'etc etc
Avatar utente
Anthony47
Moderatore
 
Post: 19228
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Re: memoria usata":

Memoria esterna
Autore: crisge73
Forum: Consigli per gli acquisti
Risposte: 14

Chi c’è in linea

Visitano il forum: Nessuno e 55 ospiti