Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
65 / 65 / 16
Регистрация: 07.04.2014
Сообщений: 334

Множественный доступ потоков к коллекциям

06.10.2014, 15:14. Показов 1808. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Подскажите в какую сторону копать.

У меня есть 8 потоков. Каждый поток получается данные (структура в 10 полей) от одного или нескольких устройств. Может поступать в сумме до сотни тысяч сообщение с каждого потока. Не больше 100 в секунду.

Нужно реализовать:
1. Вывод всех сообщений поступающих в каждом потоке в отдельном окне.
2. Определение какие сообщения потока принадлежат какому устройству и их вывод в разных окнах.
3. Возможность построения графика в реальном времени для: любого из устройств, для нескольких устройств одного потока одновременно и напоследок построение графиков всех устройств всех потоков одновременно. Причём не с момента начала работы программы, а по желанию пользователя. Т.е. выбрал я 2 устройства из разных потоков и надо вывести ранее поступившие данные и выводить новые поступающие.
4. Ну и бэкап всех поступивших сообщений потока в txt в конце работы программы.

Как я это себе представляю:

1 вариант: Одна глобальная коллекция (concurent?) к которой имеют доступ все потоки и тупо кидают в неё сообщения. Далее обработчик вытаскивает сообщения и выводит в окна для каждого из устройств и в графики. Но как будет с производительностью. Сообщения раскинуты по всей коллекции и надо будет её всю шерстить. например в ней уже 100к сообщений и я захочу открыть график двух устройств. придётся пробегать все 100к сообщений и искать нужные устройства.

2 вариант: Коллекция и обработчик для каждого потока свои. Сообщения добавляются в коллекцию потока. Обработчик обрабатывает коллекцию только своего потока и добавляет данные разных устройств в глобальную коллекцию устройств. Графики строятся по уже готовым данным глобальной коллекции устройств.

Интересует как сделать лучше всего и какие технологии использовать. Спасибо!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.10.2014, 15:14
Ответы с готовыми решениями:

Доступ к коллекциям в коллекции коллекций List<T>
Помогите разобраться с доступом к коллекции в list&lt;list&lt;T&gt;&gt; Компиляцию проходит, но при выпонении на первой итерации выдает исключение ...

Доступ к БД с разных потоков
как реализовать доступ к одной базе данных с разных потоков? когда один сервер обрабатывает несколько клиентов то у меня выходит...

Доступ к очереди из разных потоков
Подскажите по многопоточности, у меня есть очередь (Queue) и мне надо организовать к ней доступ из разных потоков, выискал несколько...

5
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
06.10.2014, 15:45
fidgi, большого опыта не имею в многопоточности, но имхо, если данные нужны только для чтения, то лучше второй вариант. если же данные будут изменятся, то тогда в любом случае доведется делать синхронизацию потоков, тогда уж лучше первый вариант. а насчет поиска по записям - так никто не запрещается сделать хеш-таблицу, или хотя бы словарь, а не тупо список.
1
65 / 65 / 16
Регистрация: 07.04.2014
Сообщений: 334
06.10.2014, 16:05  [ТС]
Learx, только чтение. Можно и хеш таблицу, да.
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
06.10.2014, 17:17
Лучший ответ Сообщение было отмечено fidgi как решение

Решение

fidgi, Буфер приема на BlockingCollection<T>, с периодическим дампом в DataTable в оперативке. Соответственно графики и информация берется из DataTable обычными select'ами.

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

PS: Есть еще вариант: каждый поток пишет данные напрямую в базу MSSQLServer, тот без труда потянет и 100 записей/сек и выборки. Но для риалтайма такая схема не пойдет.
1
65 / 65 / 16
Регистрация: 07.04.2014
Сообщений: 334
07.10.2014, 10:08  [ТС]
freeba, т.е. сделать буфер приёма (на 1000 сообщений к примеру) для всех потоков и дампить его в оперативку при наполнении. ок. А нет смысла делать несколько DataTable каждая для своего устройства?
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
07.10.2014, 12:15
fidgi, если только каждая для своего потока, но будет сложнее делать совмещенные графики. Писать напрямую в одну таблицу из нескольких потоков будет очень медленно + эта операция не потокобезопасная.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.10.2014, 12:15
Помогаю со студенческими работами здесь

Доступ к данным из нескольких потоков
Суть вот в чем. Приложение в потоке получает данные по tcp эти данные надо обработать и дать доступ еще как минимум 2 - 3 потокам. имеется...

Доступ к стриму из разных потоков
Задача такая, имеем мемористрим, в одном потоке постоянно пишем его. В другом потоке необходимо по запросу считывать весь поток в...

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

Доступ к данным из пула потоков
У меня в основном потоке формируется матрица такая: int matrix = new int; Потом создаю пул потоков: ThreadPool.SetMinThreads(4,...

Доступ к контролу из нескольких потоков
Всем привет! Если создать 2 потока и дать им работу с выводом информации в richTextBox, то выскочит ошибка: Дополнительные сведения:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru