Ricerca 
it-ITen-US
Registrazione
Accedi
In-Vesti Dotnetwork
IN-VESTI DNW!!!
Sono finalmente arrivate le nuovissime T-Shirt di DotNetWork!!! Con soli 15,00 € ci sosterrai nelle spese di gestione della Community e ti invieremo a casa una splendida maglietta.
Se vuoi contribuire al mantenimento di DotNetWork.it Vai sulla pagina Iscrizioni
Effettua il pagamento usando IWBank
Click per andare alla pagina di Iscrizione
Oppure un Bonifico bancario (le coordinate sono sulla pagina Iscrizioni), inviaci una mail a support@dotnetwork.it indicandoci la tua taglia e l'indirizzo di spedizione.  Non appena verificata la ricezione del pagamento provvederemo a spedirti la tua T-Shirt.  Le magliette sono disponibili nelle taglie S-M-L-XL-XXL (in caso di esaurimento di una delle taglie, indica quella di "Backup"). Grazie per IN-VESTIRTI con NOI!!!
.:DotNetWork Founders:.
    Stampa     


DotNetWork Forums
WPF Immagini e memoria
Ultimo Post 17 mag 2010 16.15 by fededi. 8 Risposte.
Stampa immediata
Ordina:
PrevPrev ProssimoProssimo
Non sei autorizzato ad inviare una risposta.
Autore Messaggi

Posts:173

--
30 mar 2010 11.22  
Salve a tutti,
scusatemi se nell'oggetto sono stato un pò vago.

Ho un progetto in cui ad intervalli regolari carico un'immagine con una transizione in animazione. Il problema è che su XP ho un progressivo ed inarrestabile consumo di memoria mentre su win7 questa si assesta su un valore e rimane su quest'intorno. Potete immaginare che dopo qualche tempo sul sistema XP la macchina vada in crisi. Ho provato a cercare varie soluzioni su g... ma sembra non avere una risposta certa. Su winForm bastava usare Dispose e le risorse tornavano a posto, ma su WPF?

Questo è uno stralcio del codice usato per caricare l'immagine:

Dim bm As New BitmapImage
Using file As New IO.FileStream(nomefile, IO.FileMode.Open)
bm.BeginInit()
bm.StreamSource = file
bm.CacheOption = BitmapCacheOption.OnLoad
bm.EndInit()
End Using

e sono arrivato a questo seguendo un forum sullo stesso argomento, in cui consigliano di caricare l'immagine da uno stream piuttosto che da: bm.UriSource = New System.Uri(nomefile, UriKind.Absolute).

dopodichè assegno l'immagine al controllo: ImgPromo.Source = bm.

Avete qualche suggerimento per tenere il consumo delle risorse sotto controllo?

Grazie

Posts:811

--
30 mar 2010 13.53  

Probabilmente sto per dire un'eresia perché non so come funzioni WPF pertanto siete autorizzati a randellarmi se è il caso.
In Winforms ci sono alcuni problemi quando si caricano e scaricano immagini per cui ad esempio il file letto con un "image.FromFile(...);" non viene chiuso ed è quindi necessario fare degli strani workaround con i memory stream.
Il fatto che l'applicazione WPF non rilasci mai le risorse nonostante lo Using che hai predisposto nel codice mi dice che c'è qualcosa che non va relativamente al Garbaging degli oggetti che istanzi, pertanto il primo suggerimento che mi viene in mente è provare a fare un collect esplicito con un GC.Collect per vedere se cambia qualcosa, se però non cambia nulla, vuol dire che gli oggetti non vengono rilasciati quindi il tuo Using da solo non basta.
hai provato a mettere comunque un Close dopo il bm.Endinit()?
anche se lo using dovrebbe farlo da solo non si sa mai.
La sola cosa che mi da da pensare in quel codice è che bm lo hai generato fuori dallo Using, quindi non viene rilasciato alla fine dell'operazione e potrebbe essere che sia quello il motivo per cui il file stream rimane appeso e l'oggetto non viene riciclato come dovrebbe.

fammi sapere
saluti
Sabrina

Sabrina

Posts:173

--
30 mar 2010 15.19  
Grazie per la risposta.
Diciamo che la parte "avida" è WPF. Ho aggiunto il buon GC.Collect e qualcosa è cambiato. Il fatto è che sembra che il componente Image di WPF non rilasci mai la risorsa allocata (anche se non sono sicuro che si tratti di questo, WPF dovrebbe lavorare con le DX e non conosco la logica di trattamento degli elementi "media". Un tempo con VB6 alla mala parata si piazzava un DoEvent() e al 75% si risolvevano le cose. Ma ora? La mia dovrebbe essere un'applicazione 24/7 quindi dovrei poter lasciare il sistema "intonso" al cambiare delle immagini. Indago ancora.

Posts:173

--
31 mar 2010 07.45  
Dunque,
dopo una mezza giornata (dalle 18 di ieri alle 8 di stamani) il sistema sembra assestarsi su dei valori d'intorno. Sulla macchina con win7 (1 Gb) si attesta su 100 Mb di memoria occupata (dopo essere salita a oltre 800, quindi scesa verso 50). Sulla macchina con WinXP (3Gb) si è assestato su 1,5 Gb di memoria occupata. I sistemi rispondono prontamente ad ogni sollecitazione (apro il menu start e posso lanciare altri applicativi).
Posso ritenermi soddisfatto? Il sistema può ritenersi stabile?

Posts:173

--
08 apr 2010 07.56  
NO.

Il sistema non è stabile nemmeno per idea. Mangia così tante risorse... invisibili che al primo accesso ad una query sqlce schianta immediatamente, ed è noto che sqlce schianta con facilità se non ci sono risorse a sufficienza.
Su gestione task di win7 ho un working set privato di 80k, il working set di 80k ed il picco working set di 700k, ma la dimensione commit di 1.585.000 kb... prima o poi avrò un errore out of memory. Esiste una qualche soluzione? Il sistema dovrebbe girare 24/7 senza problemi.

Federico

Posts:811

--
22 apr 2010 09.16  
A mio parere c'è qualche problema nel modo e metodo in cui le immagini vengono istanziate, che non permette il corretto garbaging delle stesse, pertanto ti consiglio di verificare se quello che usi è l'unico metodo possibile.

mi spiace non avere competenze per darti una dritta più specifica.

saluti
Sabrina
Sabrina

Posts:811

--
22 apr 2010 09.22  

Poscrittum

hai provato a dare un'occhiata a questo articolo,

http://msdn.microsoft.com/it-it/lib...S.85).aspx

visto che quello che fai può considerarsi una animazione magari trovi qualche suggerimento.

ciao
Sabrina

Sabrina

Posts:811

--
22 apr 2010 09.29  
Ho trovato anche questo che è x silverlight ma è sempre wpf
magari ti da qualche idea.

http://silverlightexample.blogspot.com/2008/06/animation-in-depth-with-silverlight-20.html

ciao
Sabrina
Sabrina

Posts:173

--
17 mag 2010 16.15  
Inserito da Sabrina (DNW TEAM) su 22 apr 2010 10.22

Poscrittum

hai provato a dare un'occhiata a questo articolo,

http://msdn.microsoft.com/it-it/lib...S.85).aspx

visto che quello che fai può considerarsi una animazione magari trovi qualche suggerimento.

ciao
Sabrina



Ciao Sabrina, purtroppo ho visto solo oggi le tue risposte. Grazie per i suggerimenti, non mancherò di prenderne visione. In particolare questo è molto pertinente.
Federico
Non sei autorizzato ad inviare una risposta.

Active Forums 4.1
       
Articoli
Panoramica degli Eventi Pilotati
Come iniziare a capire com'è fatto WPF (parte 4)
2007/08/14 | Autore: Patrizia Cosolo
Autenticazione ASP.NET
Come funziona la configurazione dell'autenticazione ASP.NET? Scopriamolo tramite alcuni test.
2007/08/09 | Autore: Rudy Azzan
Miniguida alla OOP con il .NET Framework- Parte III
Un' importante eredità: l'ereditarietà
2009/02/08 | Autore: Alberto De Luca
Icone e Toolstrip
Icone della giusta dimensione e Toolstrip modificate a runtime
2009/06/28 | Autore: Sabrina Cosolo
SQL Server Nozioni base (parte 1)
Come creare un database in SQL Server Usando Sql Management Studio
2008/03/09 | Autore: Sabrina Cosolo
ADO.NET Funzionalità di base
Effettuare una ricerca su recordset disconnessi tramite DataView
2007/12/02 | Autore: Andrea Zingoni
Panoramica del Sistema dei Comandi
Come iniziare a capire com'è fatto WPF (parte 5)
2007/09/30 | Autore: Patrizia Cosolo
.NET e l'Interoperabilità COM
Come utilizzare Dll non referenziabili per convertire un documento Word in PDF
2008/07/05 | Autore: Massimo Lofrano
    Stampa     
Home|Forums|Blogs|Mappa del sito
© 2007-2010 by DotNetWork  .:.  Condizioni d'uso  .:.  Privacy  .:.  Accedi  .:.