Modification d'un TextBox à partir d'un autre thread [Résolu]

shackleton1986 9 Messages postés jeudi 12 janvier 2006Date d'inscription 21 mars 2007 Dernière intervention - 12 mars 2007 à 17:12 - Dernière réponse : shackleton1986 9 Messages postés jeudi 12 janvier 2006Date d'inscription 21 mars 2007 Dernière intervention
- 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
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
cs_Willi 2381 Messages postés jeudi 12 juillet 2001Date d'inscription 13 février 2015 Dernière intervention - 12 mars 2007 à 19:00
3
Merci
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) ?

++

Merci cs_Willi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de cs_Willi
shackleton1986 9 Messages postés jeudi 12 janvier 2006Date d'inscription 21 mars 2007 Dernière intervention - 12 mars 2007 à 20:09
0
Merci
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
Commenter la réponse de shackleton1986

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.