Oppure

Loading
12/09/12 14:08
ivan_j_147
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
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:
private sub checkBatteria
  dim batteriaScarica as boolean
  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...
aaa
12/09/12 16:56
ampeg
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

aaa
12/09/12 17:15
ampeg
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

msdn.microsoft.com/it-it/library/…

il controllo della carica lo fai in un ciclo Do While all'interno dell'evento DoWork dell'oggetto BackgroundWorker
Ultima modifica effettuata da ampeg 12/09/12 17:19
aaa
13/09/12 7:14
ivan_j_147
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'.
aaa