Je souhaite transmettre deux paramètres ou plus à un thread dans VB 2008.
La méthode suivante (modifiée) fonctionne très bien sans paramètres et ma barre d'état est mise à jour très cool-y . Mais je n'arrive pas à le faire fonctionner avec un, deux ou plusieurs paramètres.
Ceci est le pseudo code de ce que je pense devrait se passer lorsque le bouton est enfoncé:
Private Sub Btn_Click()
Dim evaluator As New Thread(AddressOf Me.testthread(goodList, 1))
evaluator.Start()
Exit Sub
C'est la méthode testthread:
Private Sub testthread(ByRef goodList As List(Of OneItem), ByVal coolvalue As Integer)
StatusProgressBar.Maximum = 100000
While (coolvalue < 100000)
coolvalue = coolvalue + 1
StatusProgressBar.Value = coolvalue
lblPercent.Text = coolvalue & "%"
Me.StatusProgressBar.Refresh()
End While
End Sub
Tout d'abord : AddressOf
obtient simplement le délégué d'une fonction - vous ne pouvez rien spécifier d'autre (c'est-à-dire capturer des variables).
Maintenant, vous pouvez démarrer un fil de deux manières.
Action
dans le constructeur et juste Start()
le thread.ParameterizedThreadStart
et forward one extra à la méthode indiquée lors de l'appel de .Start(parameter)
Je considère cette dernière option comme un anachronisme des temps pré-génériques, pré-lambda - qui se sont terminés au plus tard avec VB10.
Vous pourriez utiliser cette méthode brute et créer une liste ou une structure que vous transmettez à votre code de thread en tant que paramètre objet unique, mais puisque nous maintenant avons des fermetures, vous pouvez simplement créer le fil sur une Sub
anonyme qui connaît par elle-même toutes les variables nécessaires (travail effectué pour vous par le compilateur).
Soo ...
Dim Evaluator = New Thread(Sub() Me.TestThread(goodList, 1))
C'est vraiment juste que;)
Quelque chose comme ça (je ne suis pas un programmeur VB)
Public Class MyParameters
public property Name As String
public property Number As Integer
End Class
Thread newThread = new Thread(AddressOf DoWork);
Dim parameters As New MyParameters
parameters.Name = "Arne"
newThread.Start(parameters);
public shared sub DoWork(byval data as object)
{
dim parameters = CType(data, Parameters)
}
Dim evaluator As New Thread(Sub() Me.testthread(goodList, 1))
With evaluator
.IsBackground = True ' not necessary...
.Start()
End With
Outre ce que Dario a déclaré à propos des délégués, vous pouvez exécuter un délégué avec plusieurs paramètres:
Prédéfinissez votre délégué:
Private Delegate Sub TestThreadDelegate(ByRef goodList As List(Of String), ByVal coolvalue As Integer)
Obtenez un handle sur le délégué, créez des paramètres dans un tableau, DynamicInvoke sur le délégué:
Dim tester As TestThreadDelegate = AddressOf Me.testthread
Dim params(1) As Object
params(0) = New List(Of String)
params(1) = 0
tester.DynamicInvoke(params)
La méthode la plus simple consiste à créer une classe/structure appropriée contenant toutes les valeurs de vos paramètres et à les transmettre au thread.
Une autre solution de VB10 consiste à utiliser le fait que lambdas crée un fermeture , ce qui signifie essentiellement que le compilateur effectue automatiquement ce qui précède pour vous:
Dim evaluator As New Thread(Sub()
testthread(goodList, 1)
End Sub)
Je pense que cela vous aidera ... Création de threads et transmission de données au moment du démarrage!
Imports System.Threading
' The ThreadWithState class contains the information needed for
' a task, and the method that executes the task.
Public Class ThreadWithState
' State information used in the task.
Private boilerplate As String
Private value As Integer
' The constructor obtains the state information.
Public Sub New(text As String, number As Integer)
boilerplate = text
value = number
End Sub
' The thread procedure performs the task, such as formatting
' and printing a document.
Public Sub ThreadProc()
Console.WriteLine(boilerplate, value)
End Sub
End Class
' Entry point for the example.
'
Public Class Example
Public Shared Sub Main()
' Supply the state information required by the task.
Dim tws As New ThreadWithState( _
"This report displays the number {0}.", 42)
' Create a thread to execute the task, and then
' start the thread.
Dim t As New Thread(New ThreadStart(AddressOf tws.ThreadProc))
t.Start()
Console.WriteLine("Main thread does some work, then waits.")
t.Join()
Console.WriteLine( _
"Independent task has completed main thread ends.")
End Sub
End Class
' The example displays the following output:
' Main thread does some work, then waits.
' This report displays the number 42.
' Independent task has completed; main thread ends.
Créez simplement une classe ou une structure qui a deux membres, l'un List(Of OneItem)
et l'autre Integer
et envoyez une instance de cette classe.
Edit: Désolé, vous avez également eu des problèmes avec un paramètre. Il suffit de regarder Thread Constructor (ParameterizedThreadStart) et cette page inclut un exemple simple.
Passer plusieurs paramètres pour VB.NET 3.5
Public Class MyWork
Public Structure thread_Data
Dim TCPIPAddr As String
Dim TCPIPPort As Integer
End Structure
Dim STthread_Data As thread_Data
STthread_Data.TCPIPAddr = "192.168.2.2"
STthread_Data.TCPIPPort = 80
Dim multiThread As Thread = New Thread(AddressOf testthread)
multiThread.SetApartmentState(ApartmentState.MTA)
multiThread.Start(STthread_Data)
Private Function testthread(ByVal STthread_Data As thread_Data)
Dim IPaddr as string = STthread_Data.TCPIPAddr
Dim IPport as integer = STthread_Data.TCPIPPort
'Your work'
End Function
End Class