2010-07-26 11 views
9

Sono stato un dilettante in Delphi avanti e indietro per anni e mi sono sempre chiesto perché minimizzare e ripristinare un'applicazione causa l'utilizzo di meno memoria?Delphi - Minimizza e ripristina libera memoria?

Ad esempio sto usando delphi 7 e creo un nuovo progetto con niente su di esso ma il modulo vuoto con cui tutti i progetti iniziano e poi premo F9 per eseguire l'applicazione e poi guardo l'utilizzo della memoria per l'app e si trova a circa 3,5 MB, quindi minimizzo l'app e l'utilizzo della memoria scende a circa 760 kb, quindi ripristino finalmente l'app e l'utilizzo della memoria torna a circa 1,5 MB, ovvero circa 1/2 di quello che era quando per prima cosa è stato caricato e questo mi ha sempre confuso su cosa sta facendo accadere questo e ancor più al punto è comunque necessario avviare l'applicazione con qualche direttiva che faccia utilizzare la memoria da 1,5 MB invece del 3.5mb che normalmente usa.

Cheers, Dave

+0

"Memoria" è una definizione molto vaga. Quello che vedi sta funzionando in modo decrescente. È inoltre possibile trovare questo articolo utile: http://blog.eurekalog.com/catching-memory-leaks/ – Alex

+0

È solo vago dopo aver lavorato per Microsoft abbastanza a lungo. –

risposta

5

probabilmente è qualcosa con la gestione della memoria di Windows. provare la stessa cosa con la calcolatrice di Windows e il comportamento è lo stesso :))

qui una risposta: http://support.microsoft.com/?kbid=293215 e alcune persone hanno la stessa domanda: http://digital.ni.com/public.nsf/allkb/9EA3D4258E037B8A8625763300434D4D

migliori saluti,

+0

Grazie per la risposta, sono stato più curioso di qualsiasi altra cosa, almeno ora so che non sono solo le mie app a farlo. Dave – dave

+0

+1 per articolo KB – Alex

+0

Questo è un buon esempio di Windows, dove di solito dico, quando capisco cosa hanno fatto: "[inserire qui una frase imprecatoria forte] Non posso credere che l'abbiano fatto !" Windows ti ha mentito perché non riuscivano a capire quale delle cose che potevano dirti fosse la cosa più vicina alla cosa che vuoi sapere, come quanta memoria usi questa app. Così hanno scelto una delle cose che sanno come calcolare, etichettandola con una breve etichetta facile da usare ma imprecisa; "questo è quello che stai cercando", quando chiaramente, non lo è. –

4

Here you can find molto chiara spiegazione di Ian Martins. Quando l'applicazione riduce al minimo la chiamata di sistema SetProcessWorkingSetSize per la memoria inattiva del processo.

Puoi fare lo stesso aggiungendo questo codice alla tua applicazione. In un pulsante OnClick è possibile effettuare le seguenti operazioni:

procedure LiberarMemoria; 
begin 
    if Win32Platform = VER_PLATFORM_WIN32_NT then 
    SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF); 
end; 

L'effetto è simile a ridurre l'applicazione. Se l'applicazione esegue un compito che alla fine utilizza un grande blocco di memoria, è possibile forzarlo a liberare dopo l'uso, utilizzando questo piccolo codice.

saluti

+0

Mi avrebbe aiutato se la spiegazione molto chiara di Ian Marteens fosse stata in inglese ... –

+2

Citazione dal link specificato: "La cosa più semplice sarebbe quella di eseguire un timer, ogni minuto, ad esempio". Si, come no. Stai lontano da questo articolo per il tuo bene. – Alex

+1

@Alexander per favore, controlla e leggi attentamente il mio commento e vedi che ovunque ho raccomandato che il rilascio della memoria sia fatto ogni minuto. "Ho detto: " ... Se l'applicazione esegue un compito che utilizza EVENTUALMENTE un grande blocco di memoria, è possibile forzarlo a liberare DOPO UTILIZZARLO " (1) Eventualmente (2) DOPO L'USO IT, non Ogni minuto . L'ho consigliato, per la spiegazione e per il codice. Per favore, leggi con attenzione le risposte. P.D: scusa per gli errori con l'inglese. –