Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Out of memory

Salve a tutti,
ho sviluppato un software in VB6 che utilizza alcuni ActiveX sviluppati in
VB6 e VC++.
La funzione principale di questo software e' la registrazione di dati. Il
suo utilizzo tipico prevede quindi di lasciarlo girare 24 ore su 24 per
molti giorni.
Purtroppo pero' recentemente ad un utente si e' verificato un errore del
tipo: "Il computer ha esaurito la memoria, applicazione terminata". Il
problema di e' verificato su una macchina Windows 2000 sp2 con 128 mb di
ram. Non credo si un problema di memoria totale del PC consumata perche'
monitorando il software non rilevo variazione della memoria disponibile nel
sistema.
Qualcono sa darmi dell indicazioni per capire che tipo di problema puo'
essere (tipo limiti strani di VB6) oppure indicazioni di strumenti che mi
possano aiutare nella ricerca di eventuali memory leak o simili?
Grazie,
ciao
Jojoz


Beh, diciamo che il problema era comune con VB5, e abbastanza frequente con
VB6 fino a SP3.
Dopo, si presenta raramente utilizzando controlli che cambiano spesso
colore, soprattutto quando a design-time vengono impostati con dei colori
diversi dal default.
Esiste comunque una copiosa documentazione sulla KB, relativa ai memory leak
in VB.
La memoria che si esaurisce non č la Ram (che, potendo swappare, puň
aumentare moltissimo), quando le aree limitate a 64kb, ossia User e Gdi.
E' quasi impossibile rilasciare User e Gdi non utilizzate, per cui il
problema va prevenuto.
Ciao
Alberto


Ho fatto una ricerca nella KB di 
msdn.microsoft.com
 ma non ho trovato molte
informazioni.
Ho pravato cercando "memory leak visual basic 6".
Poi suggerirmi una ricerca che mi faccia accedere alla copiosa
documentazione a cui ti riferivi?
Vorrei capire meglio cosa sono quelle aree limitate User e Gdi e cosa
influisce sul loro utilizzo.
Ciao
Jojoz

 influisce sul loro utilizzo.
Beh, questo non è un problema di VB6.
Come diceva qualcuno tempo fa, uno sviluppatore deve, prima di tutto, essere
un sistemista, ossia conoscere l'ambiente applicativo.
Comunque, come ti dicevo, la prima cosa da fare è verificare di avere almeno
SP4 di VB6, perchè fino a SP3 c'erano memory leak anche 'senza giusta
causa'.
Da SP4 in poi, devi prestare attenzione all'aspetto grafico
dell'applicativo.
In linea generale, applicativi che girano (in modo particolare su sistemi
non NT) per giorni e giorni, dovrebbero evitare di fare molti Show e Hide
(visible = true e false), o di cambiare molto spesso colori ai controlli.
Con controlli di terze parti il problema è pressochè irrisolvibile, occorre
uno spegnimento periodico della macchina.
Con controlli MS, ripeto, da SP4 siamo in una situazione molto stabile, e i
casi sono rarissimi e generalmente ben individuabili.
E' causa frequente di questo problema quello che ti dicevo prima, ossia
l'avere impostato a design-time, dei colori personalizzati a controlli
visibili sulla form.
ciao
Alberto

 visibili sulla form.
Con VB5 si aveva lo stesso problema impostando ad es. ripetutamente il 
ForeColor.
Evidentemente VB non faceva la destroyObject della penna non più utilizzata.
Soluzione: ci siamo scritti una funzione che via api creava, cambiava e 
distruggeva la penna.
Questa però è solo una delle tante cause possibili.
Potrebbero essere icone non distrutte, GetDC senza ReleaseDC ecc, solo 
per stare sulla GDI.
Dipende da cosa sta usando e se è colpa sua o di terze parti.
Ciao