Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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
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
privatesub checkBatteria
dim batteriaScarica asboolean
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...
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
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'.