Newsgroup: it.comp.lang.delphi
Titolo: Thread: mangia memoria a tradimento!!

[Vogliatemi scusare per la lunghezza del post]  :-P
Ho sviluppato un programma in cui sfrutto un Thread.
Casualmente mi sono accorto (con il TaskManager di win2000) che questa
applicazione consuma una quantita' di memoria che non e' costante
durante il suo ciclo di vita.
Dopo tanti controlli sul codice nella speranza di trovare dei memory
leaks sono riuscito ad estrapolare il problema.
Il tutto ruota sul thread e in particolar modo sul Synchronize usato
dentro la procedura Execute del thread.
Mi spiego meglio.
Mettiamo caso di creare un semplicissima applicazione composta da 1
form e da 1 Thread.
Il Thread in fase di creazione lo definisco in tal modo:
---------------
constructor TCrono.Crea;
begin
        inherited Create(true);
        Priority:=tpLower;
        FreeOnTerminate:=true;
        Suspended:=false;
end;
----------------
mentre il cuore del thread e':
---------------
procedure TCrono.Proc1;
begin
        asm
           nop
        end
end;
procedure TCrono.Execute;
begin
    while not(terminated) do Synchronize(Proc1);
   {lo sleep e' stato volontariamente tolto}
end;
--------------
Il thread lo creo ad esempio nel  Project, subito prima della riga
Appliction.Run;
Scivo:     Crono:=TCrono.Crea 
Facciamo girare il programma e osserviamo il TaskManager:
il mio progetto occupa  una certa quantita' di memoria.
Se ora apro ad esempio l'OutLook la memoria consumata dalla mia
applicazione e' cresciuta di una trentina di Kb..stessa cosa se apro
l'explorer o qualsiasi altro programma.
Se provo a chiudere uno di questi programmi l'incremento di memoria
osservata prima non viene defalcato...
teoricamente se perdessi tempo ad aprire e chiudere indefinitivamente
una qualsiasi applicazione (ad esempio l'OutLook) potrei occupare
tutta la memoria di sistema a mia disposizione..
Se invece nel Execute del Thread faccio ciclare il while senza il
richiamare nessuna procedura la memoria rimane fissa anche sotto
qualsiasi sollecitazione.
DOMANDA: Perche' il Synchronize si comporta cosi Alloca memoria? C'e'
un modo per farla rilasciare? 
Grazie gente....
~Guybrush~

 ha scritto nel messaggio
news:h7iv8t86446c9koc5...@4ax.com...


 ha scritto nel messaggio
news:0e5k6.4834$M75.1...@news6.giganews.com...


Certo che e' strana sta cosa....
posso dirti pero' che su Whistler non succede tale casino...
~Guybrush~

ho notato una cosa stranissima..
Stavo guardando il solito prg con il thread mangia memoria .
Ho aperto il Delphi e di botto il mio progetto ha deallocato un buon
mega di memoria...
??? 
Cio' significa?
~Guybrush~

 problema esiste.
Uso windowsME, giusto per chiarire. non so di altri sistemi operativi.
Ho fatto come dice guybrush (thread nel project), ho provato come dice Marco
Breveglieri (thread creato nella form). ho fatto entrambe le cose.
Io non vedo nulla. il programma mi usa il 100% di CPU, ma oltre a questo, la
memoria allocata o richiesta non cambia di una virgola.
Ho messo pure un array di thread eseguiti contemporaneamente, modificato le
priorità, cambiato la procedura sincronizzata, accluso il thread in un mio
programma piuttosto corposo per vedere differenze. Nisba come prima.
Per l'analisi ho usato Iarsn Taskinfo2000 versione 2.2.1.3 (
www.iarsn.com
).
Avete risolto qualcosa nel frattempo?
Ciao
Matteo

 ha scritto nel messaggio
news:BAam6.58229$k55.1...@news.infostrada.it...
