web-dev-qa-db-ja.com

VBでスレッドに複数のパラメーターを渡す方法

VB 2008で2つ以上のパラメーターをスレッドに渡すことを探しています。

次のメソッド(変更済み)はパラメーターなしで正常に機能し、ステータスバーは非常にクールに更新されます。しかし、1つ、2つ、またはそれ以上のパラメーターで動作させることはできません。

これは、ボタンが押されたときに起こるはずのことの擬似コードです:

Private Sub Btn_Click() 

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

Exit Sub

これは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
14
elcool

まず/AddressOfは関数へのデリゲートを取得するだけです。他のものは指定できません(つまり、変数をキャプチャします)。

これで、2つの可能な方法でスレッドを起動できます。

  • コンストラクターにActionを渡し、スレッドにStart()だけを渡します。
  • ParameterizedThreadStartを渡して転送one.Start(parameter)を呼び出すときにポイントされるメソッドに追加のオブジェクト引数

後者のオプションは、ジェネリック前、ラムダ前の時代からの時代錯誤であると考えています。これは遅くともVB10で終了しています。

couldその粗雑なメソッドを使用して、このようにスレッドコードに渡すリストまたは構造を作成します単一オブジェクトパラメータですが、 nowクロージャーを使用すると、必要な変数自体をすべて知っている匿名のSubにスレッドを作成できます(これはコンパイラーによって実行されます)。

スー...

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

本当にそれだけです;)

37
Dario

このようなもの(私はVBプログラマーではありません)

Public Class MyParameters
    public Name As String
    public Number As Integer
End Class



newThread as thread = 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

Darioがデリゲートについて述べたことに加えて、いくつかのパラメーターを使用してデリゲートを実行できます。

デリゲートを事前定義します。

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

デリゲートのハンドルを取得し、配列にパラメーターを作成し、DelegateにDynamicInvokeを作成します。

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

さて、簡単な方法は、すべてのパラメーター値を保持する適切なクラス/構造を作成し、それをスレッドに渡すことです。

VB10の別の解決策は、ラムダがclosureを作成するという事実を使用することです。これは基本的に、コンパイラーが自動的に上記を自動的に行うことを意味します。

Dim evaluator As New Thread(Sub()
                                testthread(goodList, 1)
                            End Sub)
3
Konrad Rudolph

私はこれがあなたを助けると思う...開始時にスレッドを作成し、データを渡す

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

List(Of OneItem)Integerの2つのメンバーを持つクラスまたは構造を作成し、そのクラスのインスタンスを送信します。

編集:申し訳ありませんが、1つのパラメーターにも問題があることをお見逃しました。 Thread Constructor(ParameterizedThreadStart) を見ると、そのページに簡単なサンプルが含まれています。

0
Hans Olsson

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