WMP Com Object e Dispose()

venerdì 23 maggio 2008 - 15.54

HereticMaikey Profilo | Newbie

Ciao a tutti. Ho una domanda da proporvi:

Ho utilizzato la componente COM "Windows Media Player" nella mia applicazione per riprodurre dei filmati di vario tipo (.wmv, .mpg, .avi, ecc).
Ora, nell'evento FormClosing, ho inserito delle istruzioni del tipo

Me.WMPPlayer.Dispose()
GC.Collect()

per liberare le risorse utilizzate dalla componente, ma aprendo il task manager noto che effettivamente nè il dispose, nè il garbage collector disallocano spazio. Infatti l'applicazione, prima dell'apertura della form contenente la componente, ha allocati circa 20 Mb, dopo l'esecuzione e la chiusura della form contenente il player, essa continua a mantenersi sui 50 mb circa. Dove sbaglio? Come faccio a liberare la memoria dopo che la form col player viene chiusa?

Grazie a chiunque possa aiutarmi!
Michele

Brainkiller Profilo | Guru

>circa 20 Mb, dopo l'esecuzione e la chiusura della form contenente
>il player, essa continua a mantenersi sui 50 mb circa. Dove sbaglio?
>Come faccio a liberare la memoria dopo che la form col player
>viene chiusa?

La Collect() funziona solo quando ci sono degli oggetti/riferimenti non più raggiungibili. Prova a settare il tutto a null/Nothing dopo l'uso e richiama la Collect() vedi un po' se cambia qualcosa.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

HereticMaikey Profilo | Newbie

Si ho provato anche così, solo che non ho risolto nulla.. L'utilizzo della memoria mi pare troppo alto e poichè le form vengono caricate ciclicamente, arrivo anche a toccare picchi di 80 mb...
Difatto libera ad ogni chiusura di form un pò di memoria, ma non arriva al 30% di quella che ha allocato all'apertura.

Brainkiller Profilo | Guru

>Si ho provato anche così, solo che non ho risolto nulla.. L'utilizzo
>della memoria mi pare troppo alto e poichè le form vengono caricate
>ciclicamente, arrivo anche a toccare picchi di 80 mb...
>Difatto libera ad ogni chiusura di form un pò di memoria, ma
>non arriva al 30% di quella che ha allocato all'apertura.

Allora forse vale la pena che ti scarichi un memory profiler.
C'è sia il CLR Profiler 2.0 di Microsoft che altri Memory Profiler commerciali (puoi scaricare anche le demo)

Qui trovi un elenco di Memory Profilers:
http://blogs.msdn.com/brada/archive/2005/03/17/398060.aspx

Quello di red-gate è motlo buono:
http://www.red-gate.com/products/ants_profiler/index.htm

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

HereticMaikey Profilo | Newbie

Grazie per la risposta. Non avevo mai sentito parlare di questi Memory Profiler.. Proverò a scaricarne uno e vedere un pò dov'è l'errore. Appena scopro qualcosa vi informo, magari potrà servire a qualcuno in futuro.
Grazie come sempre per la massima disponibilità.
Michele

HereticMaikey Profilo | Newbie

Ancora ciao a tutti!
Riapro questa discussione dopo qualche mesetto perchè avevo messo da parte il progetto ed ero passato ad altro. In questi giorni però l'ho ripreso in mano e nonostante tutte le modifiche apportate, continuo ad avere questo problema, ovvero quello dell'eccessivo spazio allocato nella ram, considerato il fatto che l'applicazione gira su un pc con xpe, un processore celeron 1 ghz e 512 di ram.

Ora, in buona sostanza, nella main form ho
- delle label,
- una picturebox,
- una istanza del wmp
- una istanza del riproduttore shockwaveflash.

All'avvio della form, setto il path del filmato video, di quello flash e li riproduco per 999 volte (una sorta di ripeti sempre); nel frattempo in un thread avvio una producedura che aspetta dati dalla seriale: alla ricezione di questi va a modificare, con dei delegati, il testo delle varie label, il path della picturebox, eventualmente il path del filmato video e riproduce un annuncio sonoro con directSound.
Il tutto funziona correttamente con la sola pecca che alloca sempre più spazio nella ram: comincia con una 40 di mb e sale sino ai 120 in circa 2 ore (e chissà a quanto sarebbe arrivato se l'avessi lasciata aperta). Ora, ad ogni procudura cerco sempre di settare tutto a nothing o in un caso anche forzare la collect del garbageCollector, ma il tutto senza risultati. Ho provato ad utilizzare anche ANTS profiler e dai risultati non riesco a vedere nulla di strano; dai resoconti che catturo durante l'esecuzione dell'applicazione mi esce ad esempio:

- Total number of live objects: 13840
- Total size of all live objects: 900.423 bytes

Il numero degli oggetti cresce di 2 ad ogni annuncio sonoro (li evidentemente c'è qualche oggetto che non distruggo) ma comunque non va ad influire sensibilmente sulle dimensioni totali di tutti gli oggetti "in vita": aumenta di circa 2000 bytes... troppo pochi per spiegare tutti quei mb!
Non so più cosa fare e spero davvero che possiate aiutarmi perchè altrimenti non ne vengo più fuori.
Aspetto una vostra illuminazione!
Grazie mille
Michele

Brainkiller Profilo | Guru

>- una istanza del wmp
>- una istanza del riproduttore shockwaveflash.

Hai detto niente ! Due macigni del calibro di WMP e Shockwave... Hai mai provato a vedere quanto occupano le istanze di Internet Explorere quando nella pagina ci sono dei plugin Flash/Shockwave ? Vanno tranquillamente a 70/80 mega.

>Il numero degli oggetti cresce di 2 ad ogni annuncio sonoro (li
>evidentemente c'è qualche oggetto che non distruggo) ma comunque
>non va ad influire sensibilmente sulle dimensioni totali di tutti
>gli oggetti "in vita": aumenta di circa 2000 bytes... troppo
>pochi per spiegare tutti quei mb!

I vari profiler che io sappia ti monitorano l'applicazione che hai scritto tu, non gli eventuali plugin esterni forse è per questo che non trovi tutti quei mega.

>Non so più cosa fare e spero davvero che possiate aiutarmi perchè
>altrimenti non ne vengo più fuori.

Come detto sopra non è così strano che quei due plugin mangino così tanta ram, prova a fare così, riduci la tua applicazione ad icona e poi riaprila vedi se cambia qualcosa nel consumo di ram.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

HereticMaikey Profilo | Newbie

Grazie come sempre per la risposta immediata! :D
Ho provato a ridurre ad icona ed effettivamente da 40 mb si riduce a 7 ridotto ad icona. Ripristinato poi sale sui 13 mb (non più 40). Come mai? Nel caso, ho delle alternative al wmp per riprodurre filmati?
Ancora grazie!
Michele

Brainkiller Profilo | Guru

>Grazie come sempre per la risposta immediata! :D
>Ho provato a ridurre ad icona ed effettivamente da 40 mb si riduce
>a 7 ridotto ad icona. Ripristinato poi sale sui 13 mb (non più
>40).

Non so bene il motivo, però avevo notato questa cosa. Praticamente credo che Windows scarichi la memoria perchè vede che l'applicazione è ridotta ad icona e quindi in quel momento non utilizzabile per poi ricaricarla quando la riapri, ma meno rispetto a prima.

Come mai? Nel caso, ho delle alternative al wmp per riprodurre
>filmati?

Purtroppo non saprei cosa consigliarti. Anche perchè ci sono diversi player ma non credo che si integrino con le Winforms. Resta l'opzione di far girare/lanciare i video fuori dalla Form ma non penso sia ciò che ti serve.

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

HereticMaikey Profilo | Newbie

Purtroppo la mia necessità è proprio quella di riprodurre il filmato all'interno della form. Per il filmato flash (che non fa altro che mostrare del testo scorrevole) credo di poter ovviare con del codice in vb, ma per la riproduzione video non ho alternative al wmp.
Grazie ugualmente per l'aiuto!
Michele

HereticMaikey Profilo | Newbie

Hi! Allora, continuo ad avere problemi con la memoria allocata e non capisco perchè! Stavolta ho fatto un semplice programmino per scrollare del testo in una label (il codice è qui sotto) e in fase di esecuzione la ram allocata cresce in continuazione! Che cappero sbaglio? Non capisco!

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Brainkiller Profilo | Guru

>Hi! Allora, continuo ad avere problemi con la memoria allocata
>e non capisco perchè! Stavolta ho fatto un semplice programmino
>per scrollare del testo in una label (il codice è qui sotto)
>e in fase di esecuzione la ram allocata cresce in continuazione!
>Che cappero sbaglio? Non capisco!

Beh, non è che la memoria resta sempre fissa, .NET se la prende la usa ne alloca dell'altra ecc. E' risaputo che .NET e in particolare le winform mangiano un buon quantitativo di RAM. Anche se fai una applicazione che non fa niente mangia tanquillamente 15/20 mega di ram. Se ne fai una in VC++ potrebbe mangiare molto meno 1/2 Mega. Se vuoi capir meglio i funzionamento interno del .NET dovresti leggerti i libri "Internals" di Jeffrey Richter che ti spiega bene cosa succede

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

HereticMaikey Profilo | Newbie

Mannaggia! Il fatto che allochi tanto direi che l'ho notato a mie spese... Il fatto che però aumenti in continuazione senza mai stabilizzarsi mi fa venire da pensare che magari io sbagli qualcosa... Cioè ad esempio, il codice che ho postato poco fa, perchè alloca continuamente spazio? Forse vuole vendicarsi di qualche torto subito!!

Brainkiller Profilo | Guru

>Mannaggia! Il fatto che allochi tanto direi che l'ho notato a
>mie spese... Il fatto che però aumenti in continuazione
>senza mai stabilizzarsi mi fa venire da pensare che magari io
>sbagli qualcosa... Cioè ad esempio, il codice che ho postato
>poco fa, perchè alloca continuamente spazio? Forse vuole vendicarsi
>di qualche torto subito!!

Mi pare che vai continuamente a riempire una casella di testo e il suo contenuto continua ad aumentare nel tempo o sbaglio ?
Se sì sarà per questo motivo. Inoltre come consiglio ti posso dire che se devi gestire stringhe e operare su di esse (concatenazioni, ecc.) è obbligatorio usare la classe StringBuilder che ha una migliore gestione a livello di memoria rispetto a concatenare stringhe così a+b
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

HereticMaikey Profilo | Newbie

No no, toglie un carattere e ne aggiunge uno... Il contenuto è sempre quello. Comunque proverò con Stringbuilder a vedere se cambia qualcosa! Thanks!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5