2010-10-25 38 views
10

Estoy mirando para pasar dos o más parámetros de un hilo en VB 2008.cómo pasar varios parámetros en el hilo en VB

El siguiente método (modificado) funciona bien sin parámetros, y mi barra de estado se actualiza muy cool-y. Pero parece que no puedo hacer que funcione con uno, dos o más parámetros.

Este es el pseudo código de lo que estoy pensando que debe suceder cuando se pulsa el botón:

Private Sub Btn_Click() 

Dim evaluator As New Thread(AddressOf Me.testthread(goodList, 1)) 
evaluator.Start() 

Exit Sub 

Este es el método 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 

Respuesta

0

Basta con crear una clase o estructura que tiene dos miembros, uno List(Of OneItem) y el otro Integer y envía una instancia de esa clase.

Editar: Perdón, también olvidé que tenía problemas con un parámetro. Solo mira Thread Constructor (ParameterizedThreadStart) y esa página incluye una muestra simple.

+0

Sí, funcionó con un parámetro usando ParameterizedThreadStart. Pero quiero usar la misma solución para uno o dos o más parámetros – elcool

3

Bueno, el método directo es crear una clase/estructura apropiada que contenga todos los valores de sus parámetros y pasarlos a la secuencia.

Otra solución en VB10 es utilizar el hecho de que lambdas crean un cierre , que básicamente significa que el compilador de hacer lo anterior de forma automática para usted:

Dim evaluator As New Thread(Sub() 
           testthread(goodList, 1) 
          End Sub) 
+0

Leí sobre este lambdas, pero estoy usando VS 2008 con VB8, creo. No tengo VB10 – elcool

31

En primer lugar: AddressOf sólo se pone el delegar en una función; no puede especificar nada más (es decir, capturar cualquier variable).

Ahora, puede iniciar un hilo de dos maneras posibles.

  • Pase un Action en el constructor y solo Start() el hilo.
  • pasar una ParameterizedThreadStart y hacia adelante uno argumento objeto adicional al método señaló al llamar .Start(parameter)

considero esta última opción un anacronismo desde la pre-genéricos, los tiempos pre-lambda - que han terminado en la lo último con VB10.

Usted podía uso de ese método crudo y crear una lista o estructura del cual se establece el código de rosca ya que esto parámetro de objeto único, pero ya que ahora un dispositivo de cierre, sólo puede crear el hilo en una anónimo Sub que conoce todas las variables necesarias por sí mismo (que es el trabajo realizado para usted por el compilador).

Soo ...

Dim Evaluator = New Thread(Sub() Me.TestThread(goodList, 1)) 

no deja de ser eso;)

+0

Buena respuesta, pero no tengo VB10. * Acabo de editar mi pregunta – elcool

+0

@elcool: No creo que esto requiera .Net 4.0 o VS 2010. Esto se parece a .Net 3.5 para mí. – IAbstract

+3

me da un error de compilación: 'Expression Expected' en Sub – elcool

5

Algo como esto (no soy un programador 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) 

} 
+3

amigo esto ni siquiera es vb – Kiarash

+0

Es un pseudo código, pero el concepto sigue siendo el mismo. Es cómo lo haces en .NET. – jgauffin

1

Además de lo que Darío declaró acerca de los delegados que podría ejecutar un delegado con varios parámetros:

Predefine su delegado:

Private Delegate Sub TestThreadDelegate(ByRef goodList As List(Of String), ByVal coolvalue As Integer) 

obtener un identificador para el delegado, cree parámetros en una matriz, en la DynamicInvoke Delegado:

Dim tester As TestThreadDelegate = AddressOf Me.testthread 
Dim params(1) As Object 
params(0) = New List(Of String) 
params(1) = 0 

tester.DynamicInvoke(params) 
+2

DynamicInvoke ... adiós tipo de seguridad. Una respuesta válida no obstante. – Dario

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

Creo que esto le ayudará a ... Creating Threads and Passing Data at Start Time!

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

paso de múltiples parámetros para 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 
Cuestiones relacionadas