Multi thread

martedì 22 luglio 2008 - 08.18

willy_80 Profilo | Senior Member

Ciao a tutti sto facendo un programma in vb2008 che elabora dei file che contengono delle quote, funziona tutto correttamente ma i file sono estremamente lunghi e in fase di apertura del file devo leggere il file ed eseguire una prima elaborazione delle stringhe, questo processo che è composto da 5 routine che vengono eseguite una dopo l'altra può durare anche 80/90 secondi, vorrei creare un multithread in modo da evitare che si abbia l'impressione che il programma si è piantato ma non so come si fa, mi potete aiutare?
Grazie

gigi90 Profilo | Senior Member

Per il supporto ai Thread ti puoi rifare al namespace .NET System.Threading:

un modo molto semplice per utilizzare thread nella tua applicazione lo puoi implementare utilizzando il controllo presente nella casella degli strumenti standard di Visual Studio 2008, BackGroundWorker, questo controllo dispone di del metodo RunWorkerAsync() che se richiamato esegue in un thread separato dall'applicazione il codice che è stato immesso nella procedura che gestisce l'evento DoWork del BackGroundWorker stesso.

Ad esempio tu trascini il controllo su un form dell'applicazione, poi gestisci l'evento DoWork e metti il codice da eseguire in background:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Per far partire il DoWork però devi chiamare il metodo:

BackgroundWorker1.RunWorkerAsync()

Un metodo un po più complesso ma personalizzato per gestire i thread consiste nell'utilizzare la classe System.Threading.Thread, prima di tutto ti istanzi un oggetto di questa classe, e al costruttore passi un riferimento alla procedura da eseguire in un thread separato, poi richiami il metodo Start() dell'oggetto istanziato che avvia l'esecuzione in background del codice all'interno della procedura passata al costruttore:

'Procedura da eseguire in un thread separato Public Sub FaiQualcosa Do 'Ciclo infinito While True End SUb Dim t as New System.Threading.Thread(Address Of FaiQualcosa) 'Avvia l'esecuzione in background t.Start()

Se hai qualche problema non esitare a chiedere

willy_80 Profilo | Senior Member

Ho provato ad inserire un BackgroundWorker e richiamare la routine voluta, la routine legge un file e lo scrive riga per riga in una listbox ma mi ha generato questo errore:

"Operazione cross-thread non valida: è stato eseguito l'accesso al controllo 'ListBox1' da un thread diverso da quello da cui è stata eseguita la creazione."

Allora ho provato a riscrivere l'intera routine all'interno del BackgroundWorker ma genera ancora lo stesso errore, si può in qualche modo evitare?

gigi90 Profilo | Senior Member

Lo immaginavo, ciò si verifica perche il form è eseguito in un thread a parte e dall'altro non è possibile eseguire operazioni, nel thread del form, a meno che non gli si chieda il 'permesso', in pratica devi chiedere al form di eseguire il codice che aggiorna la listbox, e lo si fa nel modo seguente(ti mostro un esempio completo):

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

willy_80 Profilo | Senior Member

Grazie mille funziona alla perfezione
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5