Newsgroup: it.comp.dotnet
Titolo: primo messaggio: Prestazioni, Multithreading e directX

Ciao,
dopo vari anni di iclvb, e poi (parallelamente) il ng microsoft per vb net, 
ecco anche su questo nuovo ng il mio primo messaggio :-)
Sto scrivendo una applicazione che fa largo uso di DirectX, tramite la 
libreria DirectShowNet.
In questa applicazione, devo usare dei filtri DS e costruire dei grafi per 
visualizzare delle cose, facendo girare anche 12 grafi contemporaneamente.
Il problema e' che lanciando l'applicazione, la cpu, semplicemente, non ce 
la fa. Guardando il task manager, posso vedere un thread di cpu (ho un i7, 
quad core, due thread per core) che va ad un impegno del 100%, mentre gli 
altri thread sono praticamente fermi, e questo sia con XP 32bit che con W7 
64 Bit.
C'e' da dire che tutti i grafi, e tutti gli oggetti interessati, vengono 
costruiti ed usano un solo thread, quello principale della applicazione.
Provando a generare i grafi in un thread separato ciascuno, la cosa sembra 
andare meglio, pero' purtroppo cosi' facendo non posso piu' utilizzare i 
pannelli (panel) della form principale per visualizzare l'output, in quanto 
non posso accedere ai panel da thread differenti da quello in cui sono stati 
creati.
Ecco allora le domande...
C'e' un modo per ottimizzare l'utilizzo delle risorse cpu?
e/o
posso creare dei controlli (ad esempio Panel) in thread secondari, ed 
"appiccicarli" nella form principale?
e/o
Altre soluzioni?
Grazie a tutti e buon ng :-)

 C'e' un modo per ottimizzare l'utilizzo delle risorse cpu?
Purtroppo non ti posso aiutare più di tanto, perché la memoria è
quella che è e mi occupo di altro da qualche anno, ma otto anni fa,
con Windows Forms su .Net 1.0, sono riuscito a fare quello che credo
tu voglia fare (GUI che continua a lasciar interagire l'utente mentre
dietro diversi calcoli grafici occupano i processori). Immagino che in
8 anni si siano cumulate sul Web altipiani di risorse su come ottenere
un simile comportamento, e probabilmente molto meglio di come lo
ottenevo io :)
--
ale
http://ale.riolo.co.uk

su .Net 1.0, sono riuscito a fare quello che credo
tu voglia fare (GUI che continua a lasciar interagire l'utente mentre
dietro diversi calcoli grafici occupano i processori).
...
Molto probabilmente pero' mi sono spiegato male.
La mia necessita' non e' quella di dover interagire con l'interfaccia 
grafica, anche perche' in quest'ultima c'e' solo un pulsante di chiusura.
Il problema e' che questi panel vengono utilizzati per mostrare i filmati 
generati dai vari grafi DS. Se creo i miei grafi in thread diversi, ottengo 
un errore di crossthreadexception quando provo a passare l'handle dei panel 
al renderizzatore.
Una soluzione che mi viene in mente e' quella di creare un panel nel thread 
secondario, ma poi, come fare a visuaizzare questo panel sulla form 
principale? Andiamo sempre in cross-thread. 

 un errore di crossthreadexception
Hai letto questo:
http://msdn.microsoft.com/en-us/library/ms171728(v=VS.100).aspx
?
-- 
ale
http://ale.riolo.co.uk
 

 Altre soluzioni?
A mio avviso dovresti spezzare il problema:
1)Il tuo codice è multithread? la risposta è no, quindi
cosa puoi portare fuori dal controllo?
2)Posso portare qualcosa fuori dal controllo? e collegarmi al thread
di presentazione? 
3)Se si posso generare n thread che parlano con quelli di presentazione?
e poi guarderei questo:
http://www.codeproject.com/KB/usercontrols/AlternateMultithreadedGUI.asp
x
Però devo avere capito bene come funzionano i thread in primis.
-- 
Cordiali saluti
Davide
Corso Microsoft net. C# 
 a Monza e Brianza 
http://tiny.cc/7XE36
Gestione sistemi informativi?
http://tinyurl.com/ygs8hbx
www.cleosolutions.com

2)Posso portare qualcosa fuori dal controllo? e collegarmi al thread
di presentazione?
...
Uhm, questo mi risulta complicato; purtroppo non sono io direttamente a 
scrivere o ad interagire con il controllo di visualizzazione, io non faccio 
altro che passare l'handle del controllo al "motore" DirectX di windows. ci 
pensa lui a visualizzare il tutto.
Un'altra cosa che mi lascia un po' perplesso.....
Ho provato a spezzare in 3 questo applicativo, facendo 3 applicazioni 
identiche che, tramite dei parametri di setting, vanno a capire quali filtri 
di cattura video devono usare.
In questo caso ho ogni applicazione che si prende carico di 4 grafi, che 
girano tutti e 4 sul thread principale.
anche in questo caso, pero', se lancio 2 applicazioni, vanno entrambe a 
lavorare su un unico core ( o meglio su un unico cpu-thread), mandandolo in 
saturazione.
come mai, pur essendo due applicazioni distinte (anche se identiche), vanno 
a lavorare sullo stesso core?
Grazie per le info