Newsgroup: it.comp.lang.vo-clipper
Titolo: [VO] mai usato destroy() ?

Premessa: non ho SDK.
Fatto: ho sotto le mani il sorgente in VO 2.5a1 di una grossa procedura, e
non compare MAI la funzione destroy() all'atto della chiusura delle
finestre, ma solo enddialog() ed endwindow().
Se non rocordo male, a lungo andare si satura la memoria a disposizione per
l'applicazione se non "distruggo" esplicitamente le finestre, quasi sempre
molto grosse e complicate con una infinità di oggetti, tabwindow e
subdatawindow.
Inoltre nessuna di queste finestre eredita da una MyDataWindow o
MyDialogWindow ma appartengono tutte alle rispettive classi standard di VO.
Eppure la procedura non da segni di stanchezza neppure dopo 8 ore di
aperture e chiusure di finestre.
Destroy() è implicito nelle end?
MI basterebbe come risposta un si, altrimenti devo subclassare tutte le
finestre della procedura.
Grazie
Massimo

Salve,
Sulla versione più recente di VO non dovrebbe più essere necessario 
usare Destroy().
Una procedura per aiutare il garbage collector nel suo lavoro sarebbe 
di mettere a zero tutte le variabili contenenti oggetti e array quando 
non servono piu.
Saluti
Wolfgang
Merano

 ha scritto nel messaggio
news:amsuaj$gq9$1...@lacerta.tiscalinet.it...



Scusa se intervengo ancora in un tuo messaggio. Non ce l'ho con te. :-)
Questa cosa la si sente dire spesso anche per quanto riguarda il Clipper
ma a me sembra che non ci sia nessun motivo logico per cui debba essere
vera. Azzerate o meno, le variabili, una volta uscite dal loro scope,
devono necessariamente essere prese in considerazione non appena il GC
entra in azione.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 non servono piu.
vero, anche se si dice non sia necessario. Io comunque lo faccio :-)
ciao
Stefano

 ha scritto nel messaggio
news:VA.0000016...@gmx.net...


 entra in azione.
in Clipper il Garbage Collector ha un lavoro molto meno gravoso che in un 
ambiente a eventi e object oriented come VO.
Esempio:
class MyWindow inherit DataWindow
    protect oServer as MyDBServer
 
class MyDBServer inherit DBServer
    protect oWindow as MyWindow
 
Se oggetti delle due classi si contengono, nessun verrà mai distrutto 
perchè rimangono sempre referenziati.
Saluti
Wolfgang
Merano


Non capisco il tuo esempio. Gli oggetti contenuti non saranno gli stessi
dei contenenti. La circolarità della tua definizione riguarda i tipi non
le istanze. Una volta istanziato un oggetto, la variabile che ad esso si
riferisce avrà uno scope (o meglio un life-time) e al termine dello
stesso la memoria utilizzata dall'oggetto tornerà inevitabilmente nelle
mani del GC, prima o poi. Non vedo alternative. Ma, come ho detto in un
precedente messaggio, forse non so bene come funziona un GC...


Ciao EMG,
se una referenza dell´oggetto 1 (
p.es
. il DBServer) č contenuta in una 
varibile d´istanza dell´oggetto 2 (
p.es
. la DataWindow), e allo stesso 
momento una referenza all´oggetto 2 in una variabile d´instanta 
dell´oggetto 2, abbiamo una situazione da dead lock:
l´ogggetto 1 non puň essere distrutto perche referenziato nell´oggetto 
2, e quello non puň essere distrutto in quanto referenziato nell' 
oggetto 1.
Come funziona il GC č uba cosa abbastanza logica: per ogni variabile 
dinamica (stringa, float, oggetto, array) viene mantenuto un contatore 
quante volte č referenziata la variabile stessa. Se questo contatore 
scende a zero, il GC puň distruggere la variabile e liberare la memoria 
relativa.
In Clipper la cosa era ancora "relativamente" semplice in quanto non 
c`erano oggetti (tranne i quattro "di serie"), e non esisteva la 
situazione che esisteva una finestra referenziata da nessuna parte ma 
lo stesso attiva ( InfoBox{ self, "titolo", "testo" }:Show() )
Sono riuscito a spiegare il concetto cosě?
Saluti
Wolfgang
Merano

 Sono riuscito a spiegare il concetto cosě?
Mi sa che ho perso il filo del discorso. Di che si parlava?


 Mi sa che ho perso il filo del discorso. Di che si parlava?
la domanda originale era se era necessario chiamare esplicitamente il 
metodo Destroy() per certe classi.
Saluti
Wolfgang
Merano

 metodo Destroy() per certe classi.
No, mi sono ricordato. Il discorso era: č necessario/utile/deleterio
mettere a zero o a NIL le variabili prima della fine del loro scope?
Secondo me no, č inutile.
