Log in

View Full Version : [VB.NET/C#] Gestione thread



Eltarion
14th June 2010, 11:31
Dopo la fantastica scorsa puntata sull'override non potete perdervi questa sulla mitica gestione dei thread... :P

Il mio problema è questo: ho un thread che gestisce il "main" e un thread che gestisce il polling di alcuni dati su un PLC. Quando la funzione che esegue il polling pesca dei nuovi dati genera un evento che viene gestito dal main. Funziona tutto correttamente, ma mi sono accorto che la sub che gestisce l'evento generato dalla funzione di polling viene eseguita sul thread del polling anzichè su quello del main.
Giusto per darvi qualche info in più:
- la funzione che gestisce il polling è un metodo di una classe "PLC" che viene istanziata nel main
-il thread del polling viene creato dalla classe "PLC" quando viene istanziato il primo oggetto (primo e unico :P )
- la sub che gestisce l'evento denerato dall'oggetto "PLC" fa parte del main

Come faccio a far gestire l'evento generato dalthread del main anzichè dal thread del polling? :hm:

Probabilmente sono stato poco chiaro quindi chiedetemi pure più info :dumbnod:

Rayvaughan
14th June 2010, 11:35
con un bel monitor

Eltarion
14th June 2010, 11:50
con un bel monitor

e dove dovrei metterlo? sulla sub che gestisce l'evento nel main? explain :nod:

Rayvaughan
14th June 2010, 11:55
sì a naso lo metterei nel main

Eltarion
14th June 2010, 12:32
ho dato un'occhiata in giro e non credo che il monitor possa aiutarmi, infatti non devo sincronizzare l'accesso a dati condivisi :/ Di fatto il mio NON è un problema di sincronizzazione: ho solo bisogno che un evento generato da un thread sia gestito da "un altro" thread già attivo :nod:

Hador
14th June 2010, 14:11
http://en.wikipedia.org/wiki/Observer_pattern ?

Eltarion
14th June 2010, 14:35
ok a prima vista sembra quello che cerco. ora gli do una lettura, se è troppo sbatti da implemetare lo lascio così però :sneer: tanto funziona, era solo una mia sega mentale :nod:

Hador
14th June 2010, 14:47
patterns 101 :nod:

Eltarion
14th June 2010, 14:51
patterns 101 :nod:

:afraid:

Kat
14th June 2010, 19:22
Ma anche se implementi l'Observer quando fai la chiamata del metodo dell'observer non la esegue sul main thread.
A che ti serve poi che venga eseguito dal main thread?

Il metodo che mi viene in mente e' di creare una Window e usare la sua pompa di messaggi, ma devi scrivere un sacco di codice per fare sta roba.
Oppure se l'applicazione e' grafica ci sono modi semplici per fare eseguire codice nel thread della UI (Invoke/BeginInvoke o usare il Dispatcher in WPF).

Eltarion
14th June 2010, 19:36
Ma anche se implementi l'Observer quando fai la chiamata del metodo dell'observer non la esegue sul main thread.
A che ti serve poi che venga eseguito dal main thread?.

voglio che venga eseguita dal main thread anzichè da quello del polling perchè sennò il polling viene "ritardato" (ok è una cosa altamente trascurabile, ma non è "formalmente" corretto)



Il metodo che mi viene in mente e' di creare una Window e usare la sua pompa di messaggi, ma devi scrivere un sacco di codice per fare sta roba.
Oppure se l'applicazione e' grafica ci sono modi semplici per fare eseguire codice nel thread della UI (Invoke/BeginInvoke o usare il Dispatcher in WPF).

sisi è un'applicazione grafica, vedo un po' quello che mi hai suggerito

Hador
14th June 2010, 19:51
ma infatti non dicevo di farlo dal main ma da farlo da un oggetto apposta

Kat
14th June 2010, 20:01
voglio che venga eseguita dal main thread anzichè da quello del polling perchè sennò il polling viene "ritardato" (ok è una cosa altamente trascurabile, ma non è "formalmente" corretto)


Allora basta usare il threadpool e farlo eseguire in modo asincrono con BeginInvoke con un delegate.

Edit: per intenderci una cosa del tipo:

public delegate void PiripicchioDelegate(object arg);

e nel metodo dove devi eseguire la procedura:

PiripicchioDelegate del=new PiripicchioDelegate(FunzioneCheAgisce);
del.BeginInvoke(arg, null, null);

il codice dentro il metodo FunzioneCheAgisce viene eseguito in un thread a parte del threadpool.
Volendo se fa poca roba il codice da eseguire lo puoi pure mettere inline con una lambda expression:
PiripicchioDelegate del= (arg) => { ...codice... };

Eltarion
14th June 2010, 20:47
ok mi avete dato da studiare per una settimana :P

ora abbiamo:

observer istanzato sul thread del main VS delegate

vedremo chi vincerà :nod:

Eltarion
24th June 2010, 11:30
sei dei nabbi! bastava usare una mailbox al posto dell'evento :nod: