несколько резьбовых vb.net программа


у меня есть этот код, который является, предполагают, чтобы работать с при запуске минимальное число потоков, скажем 5. когда начинается первые пять потоков, то он автоматически заменяет любой поток, который закончил убедившись, что всегда есть пять потоков рабочей.

проблема здесь в том, что я найти его трудно управлять где бы проанализировать замки

Private Sub StartProcess()
        intNextItemIndex = intMaxThreadCount
        ' start the first five threads
        For i = 0 To intMaxThreadCount
            If i < ListWorkItems.Count Then
                StartNextItem(i)
            End If
        Next
        ' update running threads
    End Sub

    Private Sub StartNextItem(ByVal index As Integer)
        Dim tt As New ThreadTask
        If index < ListWorkItems.Count Then

            ' start parsing thread
            Dim t As New Thread(AddressOf DoWork)
            With tt
                .Index = index
                .Task = "count"
                .Data = CStr(index * index)
            End With
            With t
                .IsBackground = True
                .Name = "Thread " & index
                .Start(tt)
            End With
            Thread.Sleep(100)
        End If
    End Sub

    Private Sub DoWork(ByVal data As Object)
        Dim tt As ThreadTask = CType(data, ThreadTask)
        Dim sTemp As String = Nothing
        Dim objLock As Object = New Object()
        Dim t As Double = 0
        myWatch = New Stopwatch
        Try
            Debug.Print("Incoming index: " & CInt(tt.Index))
            myWatch.Start()

                    SyncLock (objLock)
                        sTemp = PerformWork(ListWorkItems(CInt(tt.Index)).ToString)
                        'sTemp = CountTo()
                    End SyncLock

            myWatch.Stop()
            t = myWatch.ElapsedMilliseconds / 1000
            AddItem(tt.Index, t.ToString & " = " & sTemp)
            'AddItem(index, t.ToString)
        Catch ex As Exception
            ' catch error
            Debug.Print( ex.Message)
        End Try
 end sub

Public Sub AddItem(ByVal index As Integer, ByVal item As String)

    If Me.InvokeRequired Then
        Me.Invoke(New AddItemDelegate(AddressOf AddItem), index, item)
    Else
        Dim objLock As Object = New Object()
        Dim lvItem As New ListViewItem

        SyncLock (objLock)
            count += 1
            intNextItemIndex += 1
        End SyncLock

        With lvItem
            .Text = index.ToString
            .SubItems.Add(ListWorkItems(index).ToString)
            If item.Length < 100 Then
                .SubItems.Add(item.ToString)
            Else
                .SubItems.Add(item.Length.ToString)
            End If
        End With
        listView1.Items.Add(lvItem)


        If count = ListWorkItems.Count Then
            Button1.Enabled = True
            tsslStatus.Text = "Finished!!"
            Debug.Print("Finished: " & index.ToString)
        Else
            tsslStatus.Text = "Processing item (" & count + 1 & ")"
        End If

        StartNextItem(intNextItemIndex)
    End If

End Sub

может кто-нибудь помочь мне комментарий и скажите мне, что случилось с ним?

Это Локс ОК?

Это способ сделать это нормально?

Какие возможные улучшения, я могу сделать

всем спасибо



1058
2
задан 17 июня 2011 в 10:06 Источник Поделиться
Комментарии
1 ответ

К сожалению, весь подход разбит. Вы должны сделать ваши параллельные задачи явно в коде, так что вам не нужно межпотоковой коммуникации больше. Во-вторых, вы пишете свой собственный планировщик потоков здесь. – Нет. Планировщики уже существует, воспользуйтесь этим.

Взгляните на параллельных задач библиотека, в частности, задач и планировщиком занятий.

Еще лучше, попробовать моделировать свой алгоритм, чтобы извлечь выгоду из данных параллелизм и избегать явных потоков полностью в пользу автоматически parallelised вычислений.

1
ответ дан 17 июня 2011 в 11:06 Источник Поделиться