Problema threading

lunedì 20 luglio 2009 - 16.05

mfunky Profilo | Junior Member

Salve a tutti,
sto provando ad utilizzare il threading nella mia applicazione.
Vi spiego brevemente la situazione:
lancio n processi che aprono e chiudono un prompt dei comandi facendo delle operazioni: alla fine di ogni operazione parte quella nuova.
Io ora vorrei farle correre in modo parallelo, così ho pensato ad utilizzare il thread...
Mi son creato una classe, dove passo dei parametri al costruttore, in modo tale da avere nel threadstart un metodo senza nessun parametro e fin qui tutto bene.

Dim ts As New ThreadStart(AddressOf lProc.Lancia_Processo) Dim Mythread As New Thread(ts) Mythread.Start()

il codice lo metto dentro un ciclo for, in modo da avere n processi in base ad una listview di elementi caricati.
Però appena vado a lanciarlo, esce il seguente errore: Cross-Thread operation not valid: Control "frmMessages" accessed from a thread other than the thread it was created on.

Ora l'oggetto in questione(frmMessages) è una form dove mi stampo i log delle operazioni.
Secondo voi cosa può essere?

Grazie

Marco




http://www.marcomoscatelli.com

Jeremy Profilo | Guru

Ciao Marco.
Il problema sta nel fatto che non puoi eseguire operazioni di cross thread senza ricorrere ad un delegate.

Fai un pò di ricerche in merito ed eventualmente .....facci sapere....
Ciao

freeteo Profilo | Guru

Ciao,
ad essere precisi, diciamo che il problema sta nel fatto che stai accedendo ad un oggetto (frmMessages) che è lanciato nel thread principale dell'applicazione, da un altro thread (appunto dentro al tuo ciclo for).
Il framework ti da una possibilità non performante, ma molto comoda che è impostare (namespace System.Windows.Forms):
Control.CheckForIllegalCrossThreadCalls = false
Altrimenti come dice Jeremy devi far fare alla Form un "Invoke" delle cose che vuoi tu, tramite delegate.

Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

Jeremy Profilo | Guru

Ciao Matteo.
>Control.CheckForIllegalCrossThreadCalls = false
Uhhmmmm, credo che sia più un modo per raggirare il problema che per risolverlo.
Io rimarrei sull'utilizzo dei delegate.

Ciao

freeteo Profilo | Guru

>Uhhmmmm, credo che sia più un modo per raggirare il problema
>che per risolverlo.
>Io rimarrei sull'utilizzo dei delegate.
vedi tu, io uso quello che mi da il Framework, e se non devo fare operazioni particolarmente complicate preferisco la comodità.
Chiaramente un approccio più pulito è quello con i delegate, ma devi anche saperlo scrivere, e per la mia esperienza alcuni sviluppatori si incartano


Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo
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