Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2014, 16:01   #1
cerkonst
Пользователь
 
Аватар для cerkonst
 
Регистрация: 18.01.2011
Сообщений: 19
Вопрос Ошибка: FIFO Queue srcIndex вне диапазона массива

Здравствуйте, сталкнулся с такой проблемой, и очень долго не могу ее решить. Может найдутся умные коллеги которые меня поправят.
Ситуация следующая:
Пешется программа для управления оборудованием через USB порт. Для организации очереди передачи данных использую тип Queue q = new Queue();. Добавление и удаление элементов из этой очереди происходит параллельно, т.к. очень большой объем данных, возможно и в этом причина, но по другому никак. Программа рабочая, ошибок компиляции нет. И все бы хорошо, но иногда выскакивает ошибка: при добавлении в очередь оператором q.Enqueue(5); "Невозможно добавить элемент. srcIndex находиться вне диапазона массива".
Может кто поможет советом.
Еще примечание: добавление и удаление элементов происходит в разных дочерних потоках, Тип очереди объявлен в родительском потоке, ошибок доступа к очереди не наблюдалась.
___________________________________ _________
Самые гениальные идеи - самые простые.
Помог с ответом нажми на весы.
cerkonst вне форума Ответить с цитированием
Старый 24.07.2014, 17:07   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы бы заюзали потокобезопасную очередь чтоли...
в МСДН же написано что обычная очередь не потокобезопасна
Цитата:
Любой член этого типа, объявленный как public static (Shared в Visual Basic), является потокобезопасным. Потокобезопасность элементов экземпляров не гарантируется.
Для обеспечения потокобезопасности операций над объектом Queue, все они должны выполняться с помощью оболочки, возвращаемой методом Synchronized.
Перечисление коллекции не является потокобезопасной процедурой. Даже если коллекция синхронизирована, другие потоки могут ее изменить, что приведет к выдаче исключения перечислителем. Чтобы обеспечить потокобезопасность при перечислении, можно либо заблокировать коллекцию на все время перечисления, либо перехватывать исключения, возникающие в результате изменений, внесенных другими потоками.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.07.2014, 11:27   #3
cerkonst
Пользователь
 
Аватар для cerkonst
 
Регистрация: 18.01.2011
Сообщений: 19
Лампочка

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
вы бы заюзали потокобезопасную очередь чтоли...
в МСДН же написано что обычная очередь не потокобезопасна
Спасибо что навели на нужную тему, возможно причина крылась именно в этом. "Возможно" потому что еще прошло мало испытаний, но на данный момент где были 100% сбои, они пропали. Будем надеется что и не появятся.
Вопрос был решен заменой класса Queue<T> на ConcurrentQueue<T>.
___________________________________ _________
Самые гениальные идеи - самые простые.
Помог с ответом нажми на весы.
cerkonst вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка времени выполнения: Индекс находился вне границ массива (pascal) dijetol Помощь студентам 2 10.04.2014 16:16
Ошибка: Индекс находился вне границ массива archi-boy C# (си шарп) 11 15.11.2013 12:45
в выделенных ячееках найти числа вне диапазона 5.43 до 5.47 заменить на случаные числа в этом диапазоне? alx83 Microsoft Office Excel 1 22.06.2012 05:37
C# ошибка:"Индекс находился вне границ массива" potap88 Помощь студентам 16 18.04.2010 15:50
найдите пожалуйста ошибку qbasic жалуется что число вне диапазона когда ввожу бедный_студент Помощь студентам 4 10.05.2009 18:25