shackleton1986
Messages postés9Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention21 mars 2007
-
12 mars 2007 à 17:12
shackleton1986
Messages postés9Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention21 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
A voir également:
Modification d'un TextBox à partir d'un autre thread
cs_Willi
Messages postés2375Date d'inscriptionjeudi 12 juillet 2001StatutModérateurDernière intervention15 décembre 201822 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) ?
shackleton1986
Messages postés9Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention21 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