Модераторы: diadiavova, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Таймаут между потоками 
:(
    Опции темы
RageGod
Дата 4.8.2012, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.5.2012

Репутация: нет
Всего: нет



Столкнулся с проблемой.
У меня берется из ArrayList'а строка, и помешается в определенную строку, и после этого удаляется. Затем берется следующая и так далее.
Но при использование многопоточности, часто программа берет одну и ту же строку, т.к программа не успевает её удалить, а поток уже её берет. 

Как быть?
Может есть какой-то таймаут между потоками ?
PM MAIL   Вверх
diadiavova
Дата 4.8.2012, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



RageGod, не совсем понял, что ты делаешь, но может теб очередь использовать вместо эррэйлист? Да и с джинериками пора бы уже познакомиться. А смысл многпоточности как раз в параллельной работе. Хотя на время обработки объекта одним потоком можно этот объект заблокировать для доступа из других
http://msdn.microsoft.com/ru-ru/library/3a86s51t


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
RageGod
Дата 4.8.2012, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.5.2012

Репутация: нет
Всего: нет



Хм.
Посмотрю ваш вариант.

Точнее, работать через аргументы.
Обращаться к процедуре с аргументами, а не удалять во время работы потока из листа.
Поможет, как Вы думаете?
PM MAIL   Вверх
diadiavova
Дата 4.8.2012, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



RageGod, если ты опишешь задачу подробнее, тогда можно будет что-то советовать


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
RageGod
Дата 6.8.2012, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.5.2012

Репутация: нет
Всего: нет



Описываю задачу точнее:

Вообщем, список строк загружается в ArrayList.
После этого, берется оттуда первая линия и подставляется в ссылку. Парсятся кое-какие данные с этой ссылки, удаляется данная строка из ArrayList и берется другая.

Проблема такая:
В ArrayList загружено 2-3 строки. Потоков выставляется 5. И тогда потоки берут одно и ту же строку. То есть, она не успевает удалятся, а другой поток уже взял эту строку.

PM MAIL   Вверх
diadiavova
Дата 6.8.2012, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



RageGod, ответ тот же, что и с самого начала. Либо блокируешь доступ к коллекции другим потокам на время, пока с ним уже работает один из потоков, либо сначала извлекаешь строку из коллекции, а потом уже обрабатываешь её (лучше использовать очередь)


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
RageGod
Дата 6.8.2012, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.5.2012

Репутация: нет
Всего: нет



Цитата(diadiavova @  6.8.2012,  16:12 Найти цитируемый пост)
либо сначала извлекаешь строку из коллекции, а потом уже обрабатываешь её 

Тогда стоит объявить какую-нибудь переменную, заносить в неё строку, потом удалять из ArrayList данную строку и потом уже подставлять и парсить. Я Вас правильно понял?)

Но тогда как быть, если используется многопоточнсть?
У меня вот такая процедура многопоточности:
Код

    Public Sub pStart(ByVal number As Integer)
        i = -1
        Try
            For a = 0 To number - 1
                Dim bruteThread As New Threading.Thread(New ParameterizedThreadStart(AddressOf Parser))
                Control.CheckForIllegalCrossThreadCalls = False
                bruteThread.IsBackground = True
                bruteThread.Start()
            Next a
        Catch ex As Exception
        End Try
    End Sub

Заносить в строку и удалять из ArrayList'а в этой процедуре или сделать 2 контролирующие процедуры (первая запускает вторую, которая в свою очередь обрабатывает ArrayList, а потом запускает третью, которая уже парсит)?

Это сообщение отредактировал(а) RageGod - 6.8.2012, 16:39
PM MAIL   Вверх
diadiavova
Дата 6.8.2012, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



RageGod, так, а в чём проблема-то? Метод, обрабатывающий строки и запускаемвй в разных потоках, извлекает строку из коллекции и обрабатывает её.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
RageGod
Дата 7.8.2012, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.5.2012

Репутация: нет
Всего: нет



diadiavova
Немного не понял.
Можно пример какой-нибудь?
PM MAIL   Вверх
RageGod
Дата 8.8.2012, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.5.2012

Репутация: нет
Всего: нет



Ну так даст может кто-нибудь небольшой пример, как мне помог пользователь diadiavova
PM MAIL   Вверх
diadiavova
Дата 8.8.2012, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 8.8.2012, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



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

Imports System.Threading.Tasks
Module Module1

    Sub Main()
        Parallel.ForEach(_stringCollection,
                         Sub(item As String)
                             Console.WriteLine(item.Substring(6))
                         End Sub)
        Console.ReadKey()
    End Sub

    Dim _stringCollection As List(Of String) = New List(Of String) From {
        "строка1", "строка2", "строка3", "строка4", "строка5", "строка6",
        "строка7", "строка8", "строка9", "строка10", "строка11", "строка12"}

End Module

Здесь я вместо ArrayList использовал List(Of T), в силу того, что АррэйЛист морально устарел и его использовать нецелесообразно вообще.

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

Imports System.Threading.Tasks
Imports System.Threading
Module Module1

    Sub Main()
        'ProcessParallel()
        ProcessMultyThread()
        Console.ReadKey()
    End Sub

    Sub ProcessParallel()
        Parallel.ForEach(_stringCollection,
                               Sub(item As String)
                                   Console.WriteLine(item.Substring(6))
                               End Sub)
    End Sub

    Sub ProcessMultyThread()
        For i = 0 To _stringCollection.Count - 1
            Dim th As New Thread(AddressOf ProcessSingleString)
            th.Start()
        Next
    End Sub

    Sub ProcessSingleString()
        Dim str = _stringCollection(0)
        _stringCollection.RemoveAt(0)
        Console.WriteLine(str.Substring(6))
    End Sub

    Dim _stringCollection As List(Of String) = New List(Of String) From {
        "строка1", "строка2", "строка3", "строка4", "строка5", "строка6",
        "строка7", "строка8", "строка9", "строка10", "строка11", "строка12"}

End Module





--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
RageGod
Дата 9.8.2012, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.5.2012

Репутация: нет
Всего: нет



Так, что адаптировать ваш пример под мой, следует сделать так:
заместо 
Код

Console.WriteLine(str.Substring(6))
 вставить процедуру парсинга. И уже в процедуре парсинга использовать значение переменную str, как значение, которое надо будет подставить в ссылку. Я правильно понял?
PM MAIL   Вверх
diadiavova
Дата 9.8.2012, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



RageGod, ты понял правильно, вот только я не понял, зачем тебе это надо. Если ради производительности, то лучше использовать инструменты параллельных вычислений, как показано в первом примере или ещё лучше написать параллельный линк-запрос. А если цели другие, то интересно какие.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
RageGod
Дата 9.8.2012, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.5.2012

Репутация: нет
Всего: нет



diadiavova, На самом деле все проще, чем вы думаете.
Просто хочется более высокой скорости работы.
Точнее, чтобы парсинг был быстрее.

Другого метода наладить скорость я не знаю. (кроме оптимизации кода еще, но там и так наладил все, что знаю).
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1119 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.