4 messaggi dal 18 settembre 2008
Ciao Andrea, ho un piccolo problema con il threading e le windows form.
Sto sviluppando un'applicazione che interroga un controller mediante porta seriale, inviando delle apposite stringhe e attende la risposta che viene elaborata e trasmessa all'interfaccia (form). L'interrogazione è eseguita mediante un loop che legge le stringhe da una collezione e una alla volta le invia al controller, per ogni stringa inviata attendo la ricezione dei dati se non arriva nulla scatta un timeout e passo a leggere la stringa successiva. Dopo aver inviato l'ultima stringa il ciclo inzia di nuovo e così via. La comunicazione seriale è implementata mediante il componente SerialPort del .net 2.0 e la lettura dei dati sulla porta avviene grazie all'evento DataReceived.
La lettura dei dati funziona benissimo, ma come puoi immagginare è abbastanza onerosa, e ciò rende difficle l'interazione con la form da cui viene lanciata. Infatti i dati della lettura sono visualizzati in una griglia e devo poter interagire con essa, ma i tempi di risposta sono biblici perchè tutte le risorse sono per il polloing della porta seriale.

Per questo motivo ho provato ad implementare il tuo esempio creando un background worker che lancia l'esecuzione dell'operazione di interrogazione (invio della stringa e attesa della risposta)di ogni singola stringa, ho provato anche implementando un componente con modello asincrono degli eventi che lancia in modalità asincrona l'operazione di interrogazione. In entrambe i casi (in realtà le due soluzioni sono più o meno simili) ho notato che riesco ad interagire bene con l'interfaccia senza avere ritardi se non eseguo l'aggiornamento dei dati nella griglia. In realtà quando sull'evento RunWorkerCompleted prendo i dati ed eseguo l'aggiornamento della griglia inizia a rallentare vistosamente.

Se puoi gentilmente darmi qualche consiglio.

Saluti

Armando
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
Ciao
purtroppo non ho mai usato quell'oggetto C# per la lettura dei dati da porta seriale. Comunque il suggerimento che ti posso dare (visto che è una tecnica che ho usato per ricevere dei dati via Tcp) è avviare il background worker all'avvio dell'applicazione e NON devi farlo mai andare nell'evento di RunWorkerCompleted. Rimani in loop con questo thread in attesa dei dati dalla porta seriale e aggiorna il contenuto della window grazie all'evento WorkerReportProgress. Crea nella classe pagina un oggetto per contenere le informazioni utilizzate per aggiornare la window (contenuto della ricezione della porta seriale) e grazie a quell'evento aggiorna le informazioni con quell'evento.

Ti garantisco che funziona

Ciao

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.