web-dev-qa-db-fra.com

Comment passer plusieurs paramètres dans thread in VB

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
13
elcool

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.

  • Passez une Action dans le constructeur et juste Start() le thread.
  • Passez un argument 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;)

36
Dario

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)

}
5
jgauffin
Dim evaluator As New Thread(Sub() Me.testthread(goodList, 1))
With evaluator
.IsBackground = True ' not necessary...
.Start()
End With
4
Manuel Alves

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)
3
Jay

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)
3
Konrad Rudolph

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.
0
OverrockSTAR

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.

0
Hans Olsson

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
0
ISCI