Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Gestire evento in un altro thread
Forum - C# / VB.NET - Gestire evento in un altro thread

Avatar
ivan_j_147 (Normal User)
Newbie


Messaggi: 3
Iscritto: 03/01/2012

Segnala al moderatore
Postato alle 16:08
Mercoledì, 12/09/2012
Ciao a tutti,
chiedo subito scusa se la mia domanda è banale, ma ho qualche problema nell'"attivare" un evento.
Mi spiego meglio.
Sto sviluppando un programma che nel suo thread principale permetta di leggere via porta seriale dei dati da un dispositivo elettronico. Nel frattempo però avrei bisogno di monitorare lo stato di carica della batteria dello stesso dispositivo.
Mi piacerebbe quindi "piazzare" la seconda parte in un thread a parte (creato con un threading.timer), che operi in modo totalmente indipendente e distaccato dal thread principale.
Ovviamente però, se nel secondo thread rilevo che la batteria è scarica, ho bisogno di mostrarlo all'utente, magari scrivendolo in una label creata nel thread principale.
Ora so che questa cosa potrei gestirla con un'istruzione
Codice sorgente - presumibilmente Plain Text

  1. Invoke

, ma vorrei evitarlo. Vorrei anzi fare in modo di implementare una sorta di EventListener.
Ad esempio, se il codice del secondo thread fa una cosa di questo tipo:
Codice sorgente - presumibilmente VB.NET

  1. private sub checkBatteria
  2.   dim batteriaScarica as boolean
  3.   batteriaScarica=fcn_rileva_stato_batteria()


io vorrei che il thread principale generasse un evento non appena batteriaScarica diventa True, e da lì quindi gestire la situazione come preferisco, senza fare nessuna chiamata cross-thread.
E' una cosa possibile? Scusate se magari mi sono spiegato in modo poco comprensibile...

PM Quote
Avatar
ampeg (Normal User)
Pro


Messaggi: 124
Iscritto: 21/04/2011

Segnala al moderatore
Postato alle 18:56
Mercoledì, 12/09/2012
per la semplice la lettura dello stato della batteria secondo me è sufficiente utilizzare un timer

il threading asincrono lo puoi usare per operazioni che richiedono un carico maggiore per il microprocessore


PM Quote
Avatar
ampeg (Normal User)
Pro


Messaggi: 124
Iscritto: 21/04/2011

Segnala al moderatore
Postato alle 19:15
Mercoledì, 12/09/2012
comunque se proprio vuoi gestire la situazione in un thread separato perché magari ho capito male e la faccio più semplice di quello che è, penso che ciò che ti serve sia il BackgroundWorker

http://msdn.microsoft.com/it-it/library/system.componentmo ...

il controllo della carica lo fai in un ciclo Do While all'interno dell'evento DoWork dell'oggetto BackgroundWorker

Ultima modifica effettuata da ampeg il 12/09/2012 alle 19:19
PM Quote
Avatar
ivan_j_147 (Normal User)
Newbie


Messaggi: 3
Iscritto: 03/01/2012

Segnala al moderatore
Postato alle 9:14
Giovedì, 13/09/2012
Ciao Ampeg,
innanzitutto grazie per la risposta.
Al momento, nel mio programma, la lettura della batteria avviene effettivamente con un semplice Forms.timer, e tutto sommato sembra funzionare come dovrebbe. In ogni caso vorrei però che tutti gli eventi che scattano quando la batteria è scarica fossero gestiti al di fuori di quel timer. E vorrei inoltre che la lettura della batteria non bloccasse il regolare funzionamento continuo del software. Infine, lo spostare questa parte su un threading.timer renderebbe più funzionale ed elegante il programma. Mi rendo conto che non si può avere tutto, e che questi problemini sono più che altro miei capricci, però se una cosa si può migliorare perché non farlo?
Il backgroundWorker potrebbe fare al caso mio, ho letto che si attiva su un thread separato, ma comunque genera eventi sul thread principale. Ma possibile che non si riesca ad ottenere lo stesso funzionamento con i semplici thread? :(
Comunque vedrò di farci qualche prova.
Inoltre credo di aver trovato un altro oggetto che può tornarmi molto utile, il SynchronizationContext, ma prima di dire cavolate è meglio se provo a studiarmelo un po'.

PM Quote