многопоточность - добавьте больше потоков и продолжите работу - PullRequest
0 голосов
/ 03 апреля 2012

хорошо, вот мой код:

   For i = 0 To 10
        Dim tTemp As Threading.Thread = New Threading.Thread(AddressOf dwnld)
        tTemp.IsBackground = True
        'tTemp.Start(geturl)
        lThreads.Add(tTemp)
        'MsgBox(lThreads.Item(i).ThreadState)
    Next

Я создаю список потоков с 10 потоками, назначаю им функцию, свойства и добавляю их в список.

    'While ListBox2.Items.Count > 0
    For i = 0 To lThreads.Count - 1
        If (lThreads.Item(i).ThreadState = 12) Then
            If (ListBox2.Items.Count > 0) Then
                lThreads.Item(i).Start(geturl)
                If (i = lThreads.Count - 1) Then
                    i = 0
                End If
            Else
                Exit For
            End If
            'MsgBox(lThreads.Item(i).ThreadState)
        ElseIf (lThreads.Item(i).ThreadState = 16) Then
            lThreads.RemoveAt(i)
            Dim tTemp As Threading.Thread = New Threading.Thread(AddressOf dwnld)
            tTemp.IsBackground = True
            lThreads.Add(tTemp)
            If (i = lThreads.Count - 1) Then
                i = 0
            End If
        End If
    Next

Что происходит, я вижу, что потоки останавливаются после завершения функции dwnld. Поэтому я сначала проверяю состояние (12 означает фон и не запущен). В случае 12 запустите поток, а в случае 16 (остановлен) удалите этот конкретный поток и добавьте другой поток, как я добавил 10. выше.

Также есть проверка, когда счетчик i достигает последнего числа, перезапустите весь цикл, назначив i = 0.

Программа загружает некоторые веб-страницы, URL передается из списка box2. Geturl передаст URL и удалит его из списка. Поэтому, когда список пуст, выйдите из цикла for.

Но приведенный выше код работает только 11 раз и не перезапускается. Я пытался использовать lable и goto, но он просто зависает.

Может кто-нибудь сказать мне, что делать?

Мне нужно, чтобы 10 потоков продолжали загружать веб-страницы, а когда список пуст, выйдите из функции.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Попытка вручную управлять вашим собственным пулом потоков, вероятно, является неправильным подходом. Используйте ThreadPool.QueueUserWorkItem или предпочтительно новый Task класс. Пул потоков управляется за вас, что значительно упрощает код. Полностью отмените этот код и начните заново, используя один из методов, которые я только что упомянул. Если вы столкнетесь с проблемами при реализации любого из этих методов, тогда напишите более конкретный вопрос.

1 голос
/ 03 апреля 2012

Микро-управление потоками - ну, на самом деле, просто плохая идея.В тот момент, когда я вижу, что кто-то пытается вести список потоков, которые постоянно создаются, прерываются и уничтожаются, я просто знаю, что они обречены.Я видел опытных профессионалов, пытающихся это сделать - это забавно смотреть, ожидая неизбежного впечатляющего сбоя после нескольких месяцев попыток исправить нефиксированное.

Пулы потоков, как правило, ничего подобного.Обычно они представляют собой пул задач - экземпляры классов задач в очереди «производитель-потребитель», - которые получают несколько потоков по мере того, как они могут выполнять работу.Рабочие потоки автоматически управляют сами, получая новые задачи самостоятельно, когда они закончили со старым - не нужно никакого микро-управления более высокого уровня.

Прослушивание @Brian - забудьте управление списками потоков, проверяя ихсостояние и все такоеЭто просто сделает тебя больным.Перейти с ThreadPool.QUWI или Задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...