Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [vb.net] Thread ed errori
Forum - C# / VB.NET - [vb.net] Thread ed errori

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
foralobo (Normal User)
Pro


Messaggi: 146
Iscritto: 30/11/2009

Segnala al moderatore
Postato alle 12:20
Giovedì, 11/11/2010
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:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub ciccio()
  2.         For i = 0 To 100000
  3.             ListBox1.Items.Add(i)
  4.         Next
  5.      End Sub
  6.  
  7.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  8.         Dim t As New Threading.Thread(AddressOf ciccio)
  9.         t.Start()
  10.     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:
Codice sorgente - presumibilmente Plain Text

  1. CheckForIllegalCrossThreadCalls = False



risolvo il problema. Tuttavia questo metodo è sconsigliato per problemi di sicurezza.

allora risolverei in questo modo:


Codice sorgente - presumibilmente VB.NET

  1. Delegate Sub pippo()
  2.  
  3.     Private Sub ciccio()
  4.         If Me.ListBox1.InvokeRequired Then
  5.             Me.Invoke(New pippo(AddressOf ciccio))
  6.         Else
  7.             For i = 0 To 100000
  8.                 ListBox1.Items.Add(i)
  9.             Next
  10.         End If
  11.     End Sub
  12.  
  13.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  14.         Dim t As New Threading.Thread(AddressOf ciccio)
  15.         t.Start()
  16.     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

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 17:19
Giovedì, 11/11/2010
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.

PM Quote
Avatar
foralobo (Normal User)
Pro


Messaggi: 146
Iscritto: 30/11/2009

Segnala al moderatore
Postato alle 8:38
Venerdì, 12/11/2010
Testo quotato

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?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:19
Venerdì, 12/11/2010
Nel thread secondario, usa Me.Invoke passandogli un delegato a una funzione opportuna per far eseguire quella funzione nel thread principale.

PM Quote
Avatar
foralobo (Normal User)
Pro


Messaggi: 146
Iscritto: 30/11/2009

Segnala al moderatore
Postato alle 11:17
Venerdì, 12/11/2010
continuo a non capire...potresti scrivermi il codice corretto partendo dal mio?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 20:30
Lunedì, 15/11/2010
Guarda che ti sto solo dicendo ciò che hai già scritto:
Codice sorgente - presumibilmente Plain Text

  1. Me.Invoke(New pippo(AddressOf ciccio))


PM Quote
Avatar
foralobo (Normal User)
Pro


Messaggi: 146
Iscritto: 30/11/2009

Segnala al moderatore
Postato alle 9:31
Martedì, 16/11/2010
Testo quotato

Postato originariamente da Il Totem:

Guarda che ti sto solo dicendo ciò che hai già scritto:
Codice sorgente - presumibilmente Plain Text

  1. Me.Invoke(New pippo(AddressOf ciccio))




boh...io ho fatto tante prove usando invoke anche senza me, dal listviewma è sempre lo sesso

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:59
Martedì, 16/11/2010
Togli l'if.

PM Quote
Avatar
foralobo (Normal User)
Pro


Messaggi: 146
Iscritto: 30/11/2009

Segnala al moderatore
Postato alle 12:29
Martedì, 16/11/2010
Testo quotato

Postato originariamente da Il Totem:

Togli l'if.



ebbene si...nella disperazione avevo provato anche questo...ma logicamente cosi invoke innesca una sorta di ricorsione infinita

Ultima modifica effettuata da foralobo il 16/11/2010 alle 13:21
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo