Newsgroup: it.comp.lang.visual-basic
Titolo: [OT?] Memoria esaurita

Ciao a tutti e mi scuso per il (spero parziale) OT.
Ho alcuni clienti che usano le mie procedure gestionali (scritte in VB) che
segnalano (in modo però non sistematico) l'errore (7, mi pare) = Memoria
Esaurita.
Ora (pur ammettendo che le mie procedure saturano alla svelta la memoria
RAM), partendo dal presupposto che Pannello, Sistema, Prestazioni, Memoria
virtuale sia posizionato su Gestione automatica e che il disco di sistema
abbia abbondante spazio, da cosa può altro dipendere? Escludiamo anche altre
procedure caricate (antivirus, progr.residenti, etc.). Grazie.

 Esaurita.
Non importa quanta memoria o disco tu possieda, Windows 95/98 ha solo 128Kb
di memoria allocata per le risorse di sistema (e va già bene , visto che il
3.1 ne aveva solo 64k).
Quindi ogni oggetto con un handle che usi si mangia risorse, sia esso una
_Form, un controllo, una bitmap, uno wave, un file etc .
Questo tipo di problemi capita spesso se ci si dimentica di deallocare
queste risorse, oppure se si usano maschere con molti controlli che non
facciano parte di un array di controlli.
Questo problema è parzialmente risolto con Win 2000 o XP, che non hanno più
il limite di 128K per le risorse, ma alla lunga anche loro danno i numeri se
gli allochi risorse senza mai rilasciarle.
Sarebbe da vedere nello specifico quali delle tue procedure "consumano" più
risorse.
Ciao
*Roby*

 gli allochi risorse senza mai rilasciarle.
Grazie Roby. Resto perplesso perchè, pur avendo maschere "toste" dove gli
array di controlli sono limitati, credo di deallocare tutto esplicitamente.
In più non capisco perchè le stesse procedure, con le stesse modalità
esecutive (sequenza di richiamo degli EXE e delle finestre) solo raramente
presentano il problema su alcune macchine e mai su altre macchine con stesso
SO e memoria, in alcuni casi anche con memoria inferiore (64 Kb).


A proposito di "deallocare", mi viene un dubbio.
Scarico con Close e Set=Nothing i vari oggetti di competenza dei database,
ma per le finestre, oltre all'Unload intrinseco, occorre forse (per stare
sul sicuro) settare a Nothing ogni controllo della finestra? Non avrei
problemi perchè ho una Sub che viene richiamata all'Unload di ogni finestra.
Pensi che possa risolvere il problema o non è nemmeno il caso che perda
tempo?. Grazie.

 presentano il problema su alcune macchine e mai su altre
Dipende da che altri programmi ci girano in contemporanea.
Inoltre l'utente tipo che tiene spesso aperto Word, ti chiamerà dicendoti
che è esploso il computer mentre usava il tuo programma, e non ti dirà che
aveva contemporaneamente aperto Word (o qualche altro applicativo).
Tra l'altro ci sono applicativi che ogni volta che li lanci mangiano
risorse. Un esempio è proprio VB6. Prova a mandarlo in esecuzione e
chiuderlo un po' di volte, tenendo aperto il visualizzatore di risorse, e
fatti 4 risate. ;-)
Ciao
*Roby*

 sul sicuro) settare a Nothing ogni controllo della finestra?
Non ogni controllo, ma una volta era buona norma settare a nothing la
finestra stessa.
Mocrosoft dice che dal SP4 in poi non serve più, anzi in alcuni casi (col
SP4) potrebbe pure essere dannoso.
Ciao
*Roby*

Non so se è il tuo caso però lo scrivo:
La richtextbox ha un problema sotto w95 w98 di questo tipo: se si carica un
file rtf con delle immagini per molte volte alla fine vengono esaurite le
risorse del sistema, è necessarrio riavviare la macchina per recuperare la
memoria. Il problema penso che consista nelafatto che la rightexbox non
dealloca correttamente gli oggetti creati per visualizzare le immagini. Se
l'rtf è solo testo non vi sono problemi. Con NT4, W2000 (non so con XP)
funziona tutto correttamente, solo perchè hanno una gestione della memoria
più efficente ed "accoppano" gli oggetti abbandonati in memoria.
Dario Di Marino

 Esaurita.
Avevo lo stesso problema con un programma che aveva delle
subroutine/funzioni lunghe, mi sembra sulle 300 righe.
Se hai qualcosa del genere prova a spezzettarle.
Io avevo risolto.
Ciao