Oppure

Loading
29/08/16 17:41
orma674
Ciao a tutti.
Cerco aiuto per superare l'errore in oggetto, premetto senza disattivare il controllo da codice.

Vi riporto il codice che ho scritto per testare, se qualcuno mi da una mano a renderlo funzionale.

Imports System.Threading.Thread

Public Class Form1
Dim WithEvents xx As New test

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
'CheckForIllegalCrossThreadCalls = False
End Sub

Private Sub xx_testEvento(sender As Object, e As newEvento) Handles xx.testEvento
Me.Text = e.data
End Sub

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
xx.onTest()
End Sub
End Class

Public Class newEvento
Inherits EventArgs

Public data
End Class

Public Class test
Dim eee As New newEvento

Public Delegate Sub testDelegate(ByVal sender As Object, e As newEvento)
Public Event testEvento(ByVal sender As Object, e As newEvento)
Public ff As New Threading.Thread(AddressOf onThread)

Public Sub onTest()
ff.Start()
End Sub

Sub onThread()

Do

onXXX()
Loop
End Sub

Protected Overridable Sub onXXX()
eee.data = TimeOfDay.ToString
RaiseEvent testEvento(Me, eee)
End Sub
End Class

Ringrazio tutti anticipatamente della collaborazione.
Marcello
aaa
30/08/16 8:57
GN
Per fare in modo che del codice venga eseguito sul thread della GUI puoi servirti del metodo Invoke. Qui c'è un esempio: msdn.microsoft.com/en-us/library/…(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-3
Quindi penso potresti risolvere modificando xx_testEvento in questo modo (non l'ho testato):
    Delegate Sub SetTextCallback(sender As Object, e As newEvento)

    Private Sub xx_testEvento(sender As Object, e As newEvento) Handles xx.testEvento 
      If Me.InvokeRequired Then
         Me.Invoke(New SetTextCallback(AddressOf xx_testEvento), sender, e)
      Else
         Me.Text = e.data
      End If 
    End Sub 

In pratica leggendo la proprietà InvokeRequired il metodo "capisce" se sta girando sul thread secondario (InvokeRequired == true), e quindi utilizza Invoke() per rieseguire se stesso ma sul thread della GUI; questa volta InvokeRequired == false e quindi esegue la modifica effettiva del testo.
aaa
30/08/16 16:56
orma674
Grazie.
Il codice funziona perfettamente ma io vorrei realizzare una classe chiusa dove può essere utilizzato direttamente la valorizzazione dell'evento senza scrivere codice di delegate da parte dell'utilizzatore.
aaa
31/08/16 8:54
GN
La situazione si complica un pochino perchè come vedi per fare l'invoke hai bisogno di fare riferimento ad un controllo (nel codice di prima era Me che fa riferimento all'istanza di Form1). Forse può interessarti questo articolo: codeproject.com/Articles/21168/….
aaa