Modification d'un TextBox à partir d'un autre thread

Résolu
shackleton1986 Messages postés 9 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 21 mars 2007 - 12 mars 2007 à 17:12
shackleton1986 Messages postés 9 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 21 mars 2007 - 12 mars 2007 à 20:09
Le but de ce message est de savoir s'il existe une manière plus simple de réaliser ce code en VB .Net.

Voici le but très simple de ce programme :
Il s'agit d'une fenêtre disposant d'un contrôle TextBox et d'un Button Test. Lorsque l'on clique sur le boutton test, une instance de la classe ThreadData est crée et un thread est exécuté dans cette objet. Ce thread a pour objectif d'écrire de manière régulière du texte dans la TextBox du thread principal.

Hors en VB .Net il n'est pas possible de modifier directement la valeur de TextBox.Text à partir d'un autre thread car cela n'est pas sécurisé, j'ai donc du avoir recours à la méthode Invoke, aux événements et aux délégués et je trouve que c'est bien compliqué pour pas grand chose ...

Voici mon code (la classe IHM est ma Form principale) :

Imports System.Threading

Public Class IHM
    Dim thd As ThreadData
    Dim t As Thread
    Dim var As String

    Delegate Sub SetTextCallback(ByVal text As String)

    Private Sub IHM_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Thread.CurrentThread.Name = "Main thread"
        TextLog.Text = "Salut !!"
    End Sub

    Private Sub ButtonTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonTest.Click
        thd = New ThreadData
        AddHandler thd.NewLog, AddressOf SetText
        t = New Thread(AddressOf thd.DoTheTask)
        t.Name = "Thread 0"
        t.Start()
        Thread.Sleep(0)
    End Sub

    Private Sub SetText(ByVal text As String)
        ' InvokeRequired required compares the thread ID of the
        ' calling thread to the thread ID of the creating thread.
        ' If these threads are different, it returns true.
        If Me.TextLog.InvokeRequired Then
            Dim d As New SetTextCallback(AddressOf SetText)
            Me.Invoke(d, New Object() {text})
        Else
            Me.TextLog.Text &= vbCrLf & text
        End If
    End Sub
End Class

Public Class ThreadData
    Event NewLog(ByVal text As String)

    Sub DoTheTask()
        Dim i As Integer
        For i = 0 To 9
            RaiseEvent NewLog("N°" & CStr(i + 1) & " -> je suis " & Thread.CurrentThread.Name.ToString)
            Thread.Sleep(500)
        Next
        RaiseEvent NewLog(Thread.CurrentThread.Name.ToString & " terminé.")
    End Sub
End Class

--> Donc voila si quelqu'un connait une manière plus simple de modifier le TextBox.Text de la fenêtre principale à partir d'un autre thread qui est lancé dans une classe différente de celle de la Form je suis preneur

Merci d'avance a tous

2 réponses

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
12 mars 2007 à 19:00
Bonjour,
Et non pas de méthode plus "simple" que les délégués quand tu veux accéder à un objet qui n'a pas été créé dans le thread où tu fais ton traitement. Tu n'as pas le choix => délégué. Essais le composant BackgroundWorker, il est fait pour sa.
Et qu'y a t-il de de compliqué dans les délégués (= pointeur de méthodes) ?

++
3
shackleton1986 Messages postés 9 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 21 mars 2007
12 mars 2007 à 20:09
Ok :) Merci beaucoup pour ta réponse je vais me pencher sur les BackgroundWorker.
En fait je demandais s'il y avait pas plus simple parcque je commence le VB (déjà fait du Java par contre) et j'y ai passé toute la journée pour trouver comment fallait faire. Je crois que j'aurais besoin des bases en .NET que je maitrise pas trop
0
Rejoignez-nous