1

私は、多くのスレッドを使用してデータを生成し、それに番号を付けて (1 ~ 500)、それを Label 内に配置し、それをグリッド内に配置してから、WrapPanel 内に配置するプロジェクトを持っています。

問題。スレッド内のデータの一部は、他のデータより先に終了します。したがって、ラップ パネルは 3 1 5 6 10 2 4 7 8 9 のような数字を取得します。すべてのスレッドが終了したら、ワープ パネルを並べ替えて、1 2 3 4 5 6 7 8 9 10 のように見えるようにしたいと考えています。

Private Sub StartSearch_MouseLeftButtonUp
    Dim t As New Thread(AddressOf SearchBegin)
    t.Start(Data)
End Sub

Sub SearchBegin(Data)
    Dim Max = 10
    Dim Count = 1
    While Count < Max
        Dim t As New Thread(AddressOf Check)
        t.Start(Data)
        count += 1
    End While
End Sub

Sub Check(Data)
    'things happen here
    Dim display As New Action(Of Object)(AddressOf Progress)
    WrapPanel1.Dispatcher.BeginInvoke(display, Data)
End Sub

Sub Progress(Data)
    Dim g As New Grid
    'Pretty Up Grid
    Dim l As New Label
    'Pretty Up Label
    l.Content = Data.tostring
    g.Children.Add(l)
    WrapPanel1.Children.Add(g)
End Sub
4

1 に答える 1

1

バリアを使用します。

すべてのスレッドが完了するまで待機するには、グローバル バリアを定義します。

Dim barr As New Threading.Barrier(1)

スレッドを開始する前に参加者を追加します。

Sub startathread()
    barr.AddParticipant()
    Dim t As New Threading.Thread(AddressOf blabla)
    t.Start()
End Sub

ジョブが完了したら、完了したことを知らせます。

 Sub blabla()
    'do stuff
    barr.SignalAndWait()
 End Sub

すべてのスレッドを開始し、すべてが完了するのを待機する関数:

Sub x()
    For i = 0 To 9
        startathread()
    Next
    barr.SignalAndWait()
    'from this line on, all the threads are completed their jobs.
End Sub

並べ替えのために、スレッドは各データをリストに追加する必要があります。

Dim datalist As New List(Of String)

Sub Progress(Data)
    datalist.Add(Data.ToString)
End Sub

すべてのデータの追加が完了したら、並べ替えて配置する関数を呼び出す必要があります。

Sub SortAndPlace()
    datalist.Sort()

    For Each sdata In datalist
        Dim g As New Grid
        'Pretty Up Grid
        Dim l As New Label
        'Pretty Up Label
        l.Content = sdata
        g.Children.Add(l)
        WrapPanel1.Children.Add(g)
    Next
End Sub
于 2013-01-03T16:43:09.687 に答える