Newsgroup: it.comp.lang.visual-basic
Titolo: [.NET] Grafica ... errore di memoria

Salve avrei un problemino, e voi direte altrimenti cosa ci fai qui :)
Logicamente ..
Cmq .. sto realizzando una classa che mi ridisegni i menù con le iconcine
tutti bellini bellini .. ora il problema non è realizzare la classe o
l'applicazione in questione, ma quando succede un errore (nel mio caso
"memoria insufficiente") devo per forza riavviare tutto il comp ...
Tutte le operazioni di disegno di windows vengono rallentate o non
effettuate.
Cioè se premo il tasto destro sul desktop dopo che ho avuto l'errore il
menù non esce, tranne se non muovo il mouse (in alto o in basso) e anche
in questo caso vengono visualizzati solo i menu su cui si posa il mouse.
Ora a questo punto non mi resta che riavviare il computer e tutto si
risolve ...
Sapete come poter evitare di riavviare ogni volta?? 
Un modo per liberare la memoria occupata??
Una soluzione??
Ho Win2000 installato :)
Grazie a tutti 
Salutoni
-- 
[CapoBecchino]
www [dot] boundlessminds [dot] it
Da Barzellette.it:
 In una lapide di un cimitero c'è questo epitaffio:
"Qui riposa, per la seconda volta, Ernesto Rossi. Una prece."
Un tizio, incuriosito, chiede informazioni al necroforo che, fra l'altro,
conosceva il defunto e così gli risponde:
- Vede signore, il defunto Rossi in vita lavorava in Comune...
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 "memoria insufficiente") devo per forza riavviare tutto il comp ...
E usi solo classi del Framework per disegnarlo?
Ciao
-- 
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 Una soluzione??
rilasciare le risorse una volta utilizzate.
alcuni oggetti, e sicuramente i graphics, una volta utilizzati devono essere
scaricati manualmente, solo che non ricordo più se si usa il .dispose o
qualche altra diavoleria
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 E usi solo classi del Framework per disegnarlo?
Si :)
Saluti
ps. quando l'avrò finito lo posto sul sito comune :)


 Salutoni
Mi scuso ed aggiungo che l'errore me lo da nell'ambiente di sviluppo, cioè
mentre sto provando il programma, quindi non posso usare nessuna
istruzione di rilascio delle risorse in quanto si blocca prima :)
Arisaluti


Semprerebbe il classico problema legato al mancato uso della Dispose ogni
qual volta utilizzi degli  oggetti GDI+ (pen, brushes, images...)
Verifica meglio il tuo codice e controlla se usi Dispose sui vari oggetti
che utilizzi...
HTH
-- 
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - 
http://www.ugidotnet.org
Weblog: 
http://www.ugidotnet.org/710.blog

 che utilizzi...
Domandona: se un oggetto implementa Dispose, questa va sempre richiamata?
Non se ne occupa come al solito il GC?
E al massimo non si potrebbe risolvere il problema con GC.Collect?


 HTH
-- 
[CapoBecchino]
www [dot] boundlessminds [dot] it
Da Barzellette.it:
 In una lapide di un cimitero c'č questo epitaffio:
"Qui riposa, per la seconda volta, Ernesto Rossi. Una prece."
Un tizio, incuriosito, chiede informazioni al necroforo che, fra l'altro,
conosceva il defunto e cosě gli risponde:





 Handles o risorse GDI unmanaged che stai occupando...
Beh, ma queste sono "wrappate" dalle classi managed, e quindi saranno 
rilasciate nelle loro finalize o dispose, quindi il framework lo sa cosa 
c'è ancora in giro.
Poi arriva il GC, richiama la finalize della classe e questa rilascia le 
risorse GDI che usava.
Ovviamente se come dici tu, viene richiamata solo la Finalize e il 
rilascio è nella dispose...


 :(
il fatto č che devi fare in modo che non si pianti :-)


 il fatto č che devi fare in modo che non si pianti :-)
ma infatti non si pianta il menů .. alla fine :P
ora nelle prove, visto che sono ancora ignorante in materia, puň capitare
di sbagliare, e quando capita .. puň succedere che si pianti tutto in
blocco ... come č normale che sia .. solo che non rilascia le risorse,
quindi mi tocca riavviare .. :( uffi uffi uffi
Saluti ..


 le risorse GDI che usava.
Vero, ma lo scopo della Dispose e' proprio quello di evitare questo (non a
caso si usa la suppressFinalize...) il finalizzatore e' l'ultima spiaggia
per essere sicuri che gli oggetti vengano rilasciati correttamente se
l'utente non lo fa


 
Ma io fin qui ci sono arrivato, almeno in teoria ho studiato come 
funzionano le cose, il mio problema č a monte ..
Io sto ancora sviluppando l'applicazione e quindi l'errore me lo provoca 
nell'ide.
E' li che mi si impianta tutto e devo riavviare :(
Come faccio in questo caso a fargli rilasciare le risorse che lui ha 
occupato ???
-- 
[CapoBecchino]
Cimiteri associati & Co.
Da Barzellette.it:
In una lapide di un cimitero c'č questo epitaffio:
"Qui riposa, per la seconda volta, Ernesto Rossi. Una prece."
Un tizio, incuriosito, chiede informazioni al necroforo che, fra l'altro,
conosceva il defunto e cosě gli risponde:


 provoca nell'ide.
ci sei arrivato nel senso che fai il dispose di ogni oggetto che usi?
se sě, allora forse č il caso che ci fai vedere un po' di codice.


 
mi rendo conto che come spiego forse non č tanto chiaro. Riprovo.
L'errore che mi da č giusto, mi dovrebbe dare l'errore ed infatti mi da 
l'errore (quando si č asini nel programmare) :)
Ora il problema non č come intercettare l'errore e quindi risolverlo, 
l'errore so anche dove si trova, il mio problema č perchč quando mi da 
quell'errore l'ide si blocca, mi indica l'errore (memoria insufficiente) 
ma mi rimane tutte le risorse allocate ?
In questo modo anche se chiudo l'ide del visual studio (originale) anche 
i menu di sistema di windows e le funzioni basi del ridisegno (schermo e 
menu contestuali) mi danno gli stessi errori, cioč si ridisegnano solo 
al passaggio del mouse.
Esempio se io sul desktop clicco il tasto destro e non mi compare nulla, 
se invece muovo il puntatore del mouse nella direzione in cui dovrebbero 
esserci i pulsanti (quindi su e giu) iniziano a comparire, ma solo dove 
si posa il mouse.
Questo problema l'ho anche con i menu di sistema, stranamente perň il 
menů contestuale di explorer non mi da problemi mentre il menů superiore 
si .. BOH!!!!
Saluti ..


 mi rendo conto che come spiego forse non è tanto chiaro. Riprovo.
ecco... riprova un'altra volta :-)
per aiutarti, ti dico come l'ho capita io:
hai un codice che ti va in errore di memoria insufficiente, e per continuare
a farlo funzionare ti tocca di spegnere tutto.
a mio avviso, l'unica possibile soluzione è spegnere tutto, riaccendere,
modificare il codice aggiungendo i dispose dove servono, e riprovare. se
arrivi ad avere il messaggio di memoria insufficiente, il danno è ormai
fatto, e non hai modo di risolvere senza un bel reset.


 
Ed è quello che sto facendo ora ..
Ma per non riavviare la macchina non esiste un metodo che mi pulisca la 
memoria, che so un programmillo ad hoc .. :)
Grazie della pazienza .. e scusamo del tempo perso :)
Saluti ..
ps. Sto riavviando :(
-- 
[CapoBecchino]
Cimiteri associati & Co.
Da Barzellette.it:
In una lapide di un cimitero c'è questo epitaffio:
"Qui riposa, per la seconda volta, Ernesto Rossi. Una prece."
Un tizio, incuriosito, chiede informazioni al necroforo che, fra l'altro,
conosceva il defunto e così gli risponde:


 memoria, che so un programmillo ad hoc .. :)
Il problema è tipico dell'uso e del non rilascio di handle di oggetti 
grafici, che non sono infiniti, anche se, se hai questo problema in 
win2000 vuol proprio dire che sei alla frutta :)
Non è una questione di memoria, infatti credo che se vai su task manager 
la memoria in uso non dovrebbe essere moltissima, inoltre credo che non 
ti stia frullando il disco come quando la RAM è insufficiente.
Gli altri prog non possono più ridisegnarsi perchè tu gli hai usato 
tutti handles disponibili.
E non credo proprio che questi siano recuperabili, altrimenti basterebbe 
uccidere VS e la tua app (anzi, in VS.net basterebbe uccidere la tua 
app, dato che girano in processi differenti.
Puoi al limite provare a fare solo il logout anzichè riavviare il tutto.


Mentre scavavo un nuovo loculo, ho sentitao Zanna che ha bisbigliato: in 
data 09/07/2004 14.26:

Infatti presumevo che era una cosa simile perchè ho fatto i controlli 
che tu hai detto di fare e sono come tu hai detto.
L'errore infatti me lo segnala qui:
Private Function MakeRectangleF(ByVal rect As Rectangle) As RectangleF
	MsgBox(CType(rect.Width, Single))
         Dim rectF As RectangleF
         rectF.X = rect.X
         rectF.Y = rect.Y
         rectF.Width = rect.Width
         rectF.Height = rect.Height
         Return rectF
End Function
Se io al posto di MsgBox(CType(rect.Width, Single)) scrivo 
MsgBox(rect.Width), mi da l'errore di memoria insufficiente.
Non posso interropere il processo in quanto è in vs .. e anche se chiudo 
vs l'errore (anzi l'anomalia) permane.
Era solo per capire perchè da questo tipo di errore e come si poteva 
ovviare dopo che era successo :)
ho provato anche solo a disconnettere l'utente ma non va . .bisogna per 
forza di cose riavviare ...
Grazie a chi mi ha risposto .. :)
saluti


 
Ho un dubbio.
Questo è il sistema che MSDN consiglia dell'implementazione di Dispose:
     Public Overloads Sub Dispose() Implements IDisposable.Dispose
         Dispose(True)
         GC.SuppressFinalize(Me)
     End Sub
     Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
         If disposing Then
		{1}
             ' Free other state (managed objects).
         End If
		{2}
         ' Free your own state (unmanaged objects).
         ' Set large fields to null.
     End Sub
     Protected Overrides Sub Finalize()
         ' Simply call Dispose(False).
         Dispose(False)
     End Sub
Ora, risorse come le GDI o la chiusura di stream e raba simile dove 
andrebbe?
seguando un po' il flusso dovrebbero stare in {2}, altrimenti se il GC 
chiama Finalize e io non ho chiamato Dispose, quello che c'è in {1} non 
viene rilasciato, giusto?
Ma anche gli oggetti managed non verrebbero mai disposti, poichè da E 
{1} non ci passerebbe mai.
Mi sfugge ancora qualcosa, vero?



ciao
-- 
.A
UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org
Read my blog at: 
http://www.ugidotnet.org/4.blog