+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 1 su 1

Discussione: Accedere ai controlli di un Form da un diverso Thread

  1. #1
    L'avatar di alextyx
    alextyx non è in linea Moderatore Globale
    Luogo
    Prato
    Post
    2,585

    Accedere ai controlli di un Form da un diverso Thread

    Introduzione

    Anche se l'argomento non è tra i più gettonati, in quanto le tecniche di multithreading sono abbastanza avanzate e non molto utilizzate, quando ci si vede costretti ad adottarle, ci si trova di fronte ad una barriera di proibizioni da parte di VB2005 (ancor peggio che in VB2003), che cerca in tutti i modi di impedirci operazioni 'crossed thread'.
    Questo non significa che non si possa, per esempio, accedere ad un controllo da un thread diverso da quello in cui è stato creato, ma soltanto che la strada deve essere formalmente ineccepile e passare attraverso una funzione 'delegata', una 'Delegate', appunto.
    Questo mio post, vuole fornire un primo esempio di approccio alle tecniche di manipolazione dei controlli da thread diversi.

    Lo scenario

    Supponiamo di avere una textbox sul Form1 e di creare e attivare un nuovo thread proprio da form1. All'interno di questo nuovo thread, verrà inoltre creata una istanza di FrmDelThread, chiamata FT.
    La FrmDelThread ha un pulsante, che io userò per cambiare il testo della textbox appartenete a form1 e, prima del cambiamento, anche per leggere ciò che era contenuto nella textbox. In pratica acquisirò il contenuto di textbox1 del Form1 e ne imporrò uno nuovo. Tutto questo da un diverso thread.

    Il codice

    Nella form1 troverò:

    codice:
     
    Public Class Form1
    Dim NT As New Threading.Thread(AddressOf MioThread) 'Dichiaro e istanzio un nuovo Thread e gli assegno l'indirizzo della procedura di partenza
    Delegate Function PerCambioTextBox(ByVal S AsString) As String'Dichiaro un tipo di funziuone delegata che vuole un parametro stringa e 
    'restituisce un parametro stringa (i due tipi sono uguali in quest'esempio,ma non è assolutamente necessario che lo siano)
    Public Frm1DelegataXCambio As New PerCambioTextBox(AddressOf LeggiECambiaTextBox1) 'Istanzio una funzione delegata del tipo appena dichiarato
    ' e che ha come compito quello di eseguire la funzione LeggiECambiaTextBox1. E' obbliagtorio che la procedura a cui si punta, abbia uguale firma
    ' rispetto al tipo di delegata che si usa.
    Dim FT As FrmDelThread 'Dichiaro un oggetto di tipo 'FrmDelThread'
     
    Public Function LeggiECambiaTextBox1(ByVal NuovoTesto As String) As String
    'Memorizza il valore attuale della proprietà TEXT di Textbox1 e lo restituisce al ritorno dalla funzione.
    'Prima di tornare, assegna il nuovo valore a textbox1
    Dim res As String = Me.TextBox1.Text 'Memorizza Textbox1.text nella stringa 'res'
    Me.TextBox1.Text = NuovoTesto 'Cambia il valore della proprietà TEXT di textbox1 
    Return res 'Torna restituendo il testo che era contenuto in textbox1
    End Function
     
    Private Sub MioThread()
    FT = New FrmDelThread 'Creo una istanza di FrmDelThread, all'interno del nuovo thread
    FT.MioForm1 = Me'Fornisco all'istanza appena creata, un riferimento a Form1
    FT.ShowDialog()
    End Sub
     
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    NT.Start() 'Avvia il nuovo thread
    End Sub
     
    End Class
    Mentre in F2 (istanza di FrmDelThread), avrò:

    codice:
     
    Public Class FrmDelThread
    Public MioForm1 As Form1
     
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    'Acquisico il contenuto di textbox1 del form1 e lo assegno alla proprietà text del bottone
    'Poi impongo un nuovo testo nella textbox
    Me.Button1.Text = Me.MioForm1.TextBox1.Invoke(MioForm1.Frm1DelegataXCambio, "tttt").ToString
    End Sub
     
    End Class
    Conclusione

    Questo non è che un esempio, utile magari a risolvere un primo approccio 'pratico' al multithreading, ma l'utilizzo consapevole di queste tecniche dovrebbe passare attraverso una buona lettura di documentazione sull'argomento. In particolare bisogna rendersi conto di quali problemi possono derivare dall'accesso a medesime risorse da parte di thread diversi e adottare le opportune tecniche di sincronizzazione.
    Ultima modifica di Master85; 07-04-2007 12:43 

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi