11/11/10 11:20
foralobo
Salve, come si intuisce dal titolo vi chiedo info circa l'errore generato da thrad e specificatamente un errore che viene fuori quando si cerca di modificare lo stato di un controllo da un thread che è diverso dal thread principale dove è stato creato il controllo..
ho fatto diverse ricerche in rete ma ancora non mi è chiara una cosa.
Mettiamo voglia popolare una listbox da un thead diverso dal pricipale...scriverei cosi:
all'avvio del programma da errore dicendo che sto eseguendo un'operazione cross-thread non valida...e fin qui ci siamo
se inserisco nel form_load questa riga di codice:
risolvo il problema. Tuttavia questo metodo è sconsigliato per problemi di sicurezza.
allora risolverei in questo modo:
In questo modo funziona però ho l'impressione che a popolare il listbox sia il thread principale poichè quando mando in esecuzione mi si blocca il prog finche non finisce il ciclo cosa che ovviamente devo evitare (altrimenti non userei un thread diverso)
Domanda: Usando questo metodo di lavoro (con invoke e delegate) è possibile risolvere il mio prob? Mi spiegate meglio come risolvere se in questo modo non va bene?
Grazie
ho fatto diverse ricerche in rete ma ancora non mi è chiara una cosa.
Mettiamo voglia popolare una listbox da un thead diverso dal pricipale...scriverei cosi:
Private Sub ciccio() For i = 0 To 100000 ListBox1.Items.Add(i) Next End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim t As New Threading.Thread(AddressOf ciccio) t.Start() End Sub
all'avvio del programma da errore dicendo che sto eseguendo un'operazione cross-thread non valida...e fin qui ci siamo
se inserisco nel form_load questa riga di codice:
CheckForIllegalCrossThreadCalls = False
risolvo il problema. Tuttavia questo metodo è sconsigliato per problemi di sicurezza.
allora risolverei in questo modo:
Delegate Sub pippo() Private Sub ciccio() If Me.ListBox1.InvokeRequired Then Me.Invoke(New pippo(AddressOf ciccio)) Else For i = 0 To 100000 ListBox1.Items.Add(i) Next End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim t As New Threading.Thread(AddressOf ciccio) t.Start() End Sub
In questo modo funziona però ho l'impressione che a popolare il listbox sia il thread principale poichè quando mando in esecuzione mi si blocca il prog finche non finisce il ciclo cosa che ovviamente devo evitare (altrimenti non userei un thread diverso)
Domanda: Usando questo metodo di lavoro (con invoke e delegate) è possibile risolvere il mio prob? Mi spiegate meglio come risolvere se in questo modo non va bene?
Grazie
aaa