Oppure

Loading
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:

    
     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
11/11/10 16:19
Il Totem
Non sembra il thread principale. E' il thread principale, altrimenti avresti ancora un'eccezione, no? Sostanzialmente, chiamando Me.Invoke fai invocare dal form un delegato, e questo viene eseguito nel thread che ha creato il form, ossia il principale. Questo è l'unico modo per risolvere il problema, oltre ovviamente all'ignorare l'eccezione o a cercare di non generarla affatto.
aaa
12/11/10 7:38
foralobo
Postato originariamente da Il Totem:

Non sembra il thread principale. E' il thread principale, altrimenti avresti ancora un'eccezione, no? Sostanzialmente, chiamando Me.Invoke fai invocare dal form un delegato, e questo viene eseguito nel thread che ha creato il form, ossia il principale. Questo è l'unico modo per risolvere il problema, oltre ovviamente all'ignorare l'eccezione o a cercare di non generarla affatto.


Grazie totem,
non ho ben capito quali sono i cambiamenti da fare, potresti essere più espicito?
aaa
12/11/10 9:19
Il Totem
Nel thread secondario, usa Me.Invoke passandogli un delegato a una funzione opportuna per far eseguire quella funzione nel thread principale.
aaa
12/11/10 10:17
foralobo
continuo a non capire...potresti scrivermi il codice corretto partendo dal mio?
aaa
15/11/10 19:30
Il Totem
Guarda che ti sto solo dicendo ciò che hai già scritto:
Me.Invoke(New pippo(AddressOf ciccio))
aaa
16/11/10 8:31
foralobo
Postato originariamente da Il Totem:

Guarda che ti sto solo dicendo ciò che hai già scritto:
Me.Invoke(New pippo(AddressOf ciccio))


boh...io ho fatto tante prove usando invoke anche senza me, dal listviewma è sempre lo sesso
aaa
16/11/10 10:59
Il Totem
Togli l'if.
aaa