+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 3 su 3

Aggiornare controlli di una form da un thread di un'altra classe

  1. #1
    L'avatar di vergo77
    vergo77 non  in linea Scolaretto
    Ciao a tutti!

    Sto iniziando ora a metter mano ai threads, e mi si presenta un problema.

    SCENARIO
    Ho una classe myClass la quale ha una funzione Startup che avvia un thread, ed un evento StatusUpdated.
    Questo thread, avviato dalla myClass, ad un certo punto deve far sorgere l'evento StatusUpdated e passare un messaggio di testo che verr utlizzato dalla GUI.

    Questo il codice della myClass:

    Imports System.Threading
    
    Public Class myClass
        Inherits Control
    
        Private thOpen As New Thread(AddressOf Me.OpenDevice)
        Private Delegate Sub SetTextCallback(ByVal text As String)
        Public Event StatusUpdated(ByVal Message As String, ByVal IsError As Boolean)
    
        Public Function Startup() As Boolean
            thOpen.Start()
        End Function
    
        Private Sub SendToLog(ByVal message As String)
            ' Check if this method is running on a different thread, than the thread that created the control.
            If Me.InvokeRequired Then
                ' It's on a different thread, so use Invoke.
                Me.Invoke(New SetTextCallback(AddressOf SetText), NewText)
            Else
                ' It's on the same thread, no need for Invoke.
                SetText(message)
            End If
        End Sub
    
        Private Sub SetText(ByVal message As String)
            RaiseEvent StatusUpdated(message, True)
        End Sub
    
        Private Sub OpenDevice()
            SendToLog("OpenDevice Ciao " & Date.Now)
        End Sub
    

    In una form hu un button che lancia il metodo Startup della classe myClass,
    e questo il codice:

    
        Private WithEvents pl As New myClass
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            pl.Startup()
        End Sub
    
       
        Private Sub pl_StatusUpdated(ByVal Message As String, ByVal IsError As Boolean) Handles pl.StatusUpdated
            Label1.Text = Message   'Qui nasce l'errore!!!!!!
    
    L'errore che mi d e il seguente:
    Operazione cross-thread non valida: stato eseguito l'accesso al controllo 'Label1' da un thread diverso da quello da cui stata eseguita la creazione.


    Perch appare l'errore avendo gi utlizzato un delegato?

    Lo scopo finale far s che la classe myClass possa passare direttamente valori ai controlli della gui nella quale stata dichiarata, senza utilizzare anche nella gui dei delegati.
    Questo possibile?


    Grazie a tutti
    Roberto.

  2. #2
    Le modifiche al codice in rosso ...

    Public Class myClass
        ''' Inherits Control (Elimina)
    
        Private UIForm As Form
        Private thOpen As New Thread(AddressOf OpenDevice)
        Private Delegate Sub SetTextCallback(ByVal text As String)
        Public Event StatusUpdated(ByVal Message As String, ByVal IsError As Boolean)
    
        Public Sub New(ByVal f As Form)
            UIForm = f
        End Sub
    
        Public Function Startup() As Boolean
            thOpen.Start()
    
            Return True
        End Function
    
        Private Sub SendToLog(ByVal message As String)
            If UIForm.InvokeRequired Then
                UIForm.Invoke(New SetTextCallback(AddressOf SetText), message)
            Else
                SetText(message)
            End If
        End Sub
    
    ...
    
    e anche

    Private WithEvents pl As New myClass(Me)
    
    ℹ️ Leggi di pi su AntonioG ...

  3. #3
    L'avatar di vergo77
    vergo77 non  in linea Scolaretto
    Funzionaaaaaaaaa!

    Grazie mille per l'aiuto, se stato gentilissimo!

    Ciaoo!

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Risposte: 33
    Ultimo Post: 05-06-2020, 12:49
  2. Risposte: 6
    Ultimo Post: 10-11-2017, 16:26
  3. [C++] classe cliente di un'altra classe
    Da Nosba nel forum C/C++
    Risposte: 0
    Ultimo Post: 23-02-2014, 15:09
  4. Risolto: Eccezione controlli di un Form da un diverso Thread
    Da nala84 nel forum Visual Basic .Net
    Risposte: 17
    Ultimo Post: 25-05-2010, 13:26
  5. Articolo: Accedere ai controlli di un Form da un diverso Thread
    Da alextyx nel forum Visual Basic .Net
    Risposte: 0
    Ultimo Post: 07-04-2007, 12:51