![]() |
Модераторы: diadiavova, gambit |
![]() ![]() ![]() |
|
RageGod |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 6.5.2012 Репутация: нет Всего: нет |
Столкнулся с проблемой.
У меня берется из ArrayList'а строка, и помешается в определенную строку, и после этого удаляется. Затем берется следующая и так далее. Но при использование многопоточности, часто программа берет одну и ту же строку, т.к программа не успевает её удалить, а поток уже её берет. Как быть? Может есть какой-то таймаут между потоками ? |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
RageGod, не совсем понял, что ты делаешь, но может теб очередь использовать вместо эррэйлист? Да и с джинериками пора бы уже познакомиться. А смысл многпоточности как раз в параллельной работе. Хотя на время обработки объекта одним потоком можно этот объект заблокировать для доступа из других
http://msdn.microsoft.com/ru-ru/library/3a86s51t -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
RageGod |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 6.5.2012 Репутация: нет Всего: нет |
Хм.
Посмотрю ваш вариант. Точнее, работать через аргументы. Обращаться к процедуре с аргументами, а не удалять во время работы потока из листа. Поможет, как Вы думаете? |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
RageGod, если ты опишешь задачу подробнее, тогда можно будет что-то советовать
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
RageGod |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 6.5.2012 Репутация: нет Всего: нет |
Описываю задачу точнее:
Вообщем, список строк загружается в ArrayList. После этого, берется оттуда первая линия и подставляется в ссылку. Парсятся кое-какие данные с этой ссылки, удаляется данная строка из ArrayList и берется другая. Проблема такая: В ArrayList загружено 2-3 строки. Потоков выставляется 5. И тогда потоки берут одно и ту же строку. То есть, она не успевает удалятся, а другой поток уже взял эту строку. |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
RageGod, ответ тот же, что и с самого начала. Либо блокируешь доступ к коллекции другим потокам на время, пока с ним уже работает один из потоков, либо сначала извлекаешь строку из коллекции, а потом уже обрабатываешь её (лучше использовать очередь)
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
RageGod |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 6.5.2012 Репутация: нет Всего: нет |
Тогда стоит объявить какую-нибудь переменную, заносить в неё строку, потом удалять из ArrayList данную строку и потом уже подставлять и парсить. Я Вас правильно понял?) Но тогда как быть, если используется многопоточнсть? У меня вот такая процедура многопоточности:
Заносить в строку и удалять из ArrayList'а в этой процедуре или сделать 2 контролирующие процедуры (первая запускает вторую, которая в свою очередь обрабатывает ArrayList, а потом запускает третью, которая уже парсит)? Это сообщение отредактировал(а) RageGod - 6.8.2012, 16:39 |
||||
|
|||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
RageGod, так, а в чём проблема-то? Метод, обрабатывающий строки и запускаемвй в разных потоках, извлекает строку из коллекции и обрабатывает её.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
RageGod |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 6.5.2012 Репутация: нет Всего: нет |
diadiavova,
Немного не понял. Можно пример какой-нибудь? |
|||
|
||||
RageGod |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 6.5.2012 Репутация: нет Всего: нет |
Ну так даст может кто-нибудь небольшой пример, как мне помог пользователь diadiavova
|
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
RageGod, честно говоря, мне не очень понятно, что именно непонятно тебе. Исходные строки у тебя есть, код инициализации потоков есть, код обработки строк - тоже. Всё, что нужно сделать - это изменить код обработки так, чтобы строка сначала удалялась из коллекции, а потом только обрабатывалась. Не получится - будем разбираться. Пока просто времени нет на развёрнутый ответ, да и сидеть выдумывать строки и логику их обработки тоже не очень хочетсч, если бы ты хотябы этотвыложил, было бы уже меньше возни.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
RageGod, итак, для начала следует сказать, что для параллельной обработки элементов коллекции в 4-м фреймворке появились новые инструменты, позволяющие избежать непосредственной работы с потоками. Вот пример консольного приложения, выполняющего простую обработку коллекции строк параллельно, если запустить его несколько раз, можно увидеть, что последовательность обработки элементов может меняться.
Далее привожу пример того, о чем я говорил. Здесь у меня и первый пример и второй в одном приложении, просто вызов параллельной обработки закоментирован
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||
|
|||||
RageGod |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 6.5.2012 Репутация: нет Всего: нет |
Так, что адаптировать ваш пример под мой, следует сделать так:
заместо
|
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
RageGod, ты понял правильно, вот только я не понял, зачем тебе это надо. Если ради производительности, то лучше использовать инструменты параллельных вычислений, как показано в первом примере или ещё лучше написать параллельный линк-запрос. А если цели другие, то интересно какие.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
RageGod |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 6.5.2012 Репутация: нет Всего: нет |
diadiavova, На самом деле все проще, чем вы думаете.
Просто хочется более высокой скорости работы. Точнее, чтобы парсинг был быстрее. Другого метода наладить скорость я не знаю. (кроме оптимизации кода еще, но там и так наладил все, что знаю). |
|||
|
||||
![]() ![]() ![]() |
Правила форума VB .NET | |
|
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | VB .NET | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |