65 / 65 / 16
Регистрация: 07.04.2014
Сообщений: 334
|
||||||
1 | ||||||
Событие добавления нового члена в коллекцию FIFO26.01.2015, 15:43. Показов 2016. Ответов 8
Метки нет (Все метки)
Всем добрый день (утро/вечер)!
Суть такова. Принимаю большое количество данных, записываю их в FIFO. При записи в FIFO выдаю событие. Один из подписчиков события вынимает из FIFO сообщение и начинает длительную обработку. В итоге начинаются проблемы, так как подписчик не "отпускает" событие пока не выполнит обработку => часть передаваемых сообщений теряется (передаются с МК, у него буфер программный переполняется если долго не принимать сообщения). Игрался с потоками, всё едино. Можно сделать for() опрос коллекции например в режиме sleep(5), но это некрасиво. Итого цель: сделать постоянный приём сообщений, и оповещение о приёме сообщения которое не блочит приём (плюс обработка сообщений в порядке их прихода). Как сделать событие которое оповестит подписчика и сразу же вернёт управление назад? Может тут какой-то паттерн придуман? тестовый вариант проблемы ниже.
0
|
26.01.2015, 15:43 | |
Ответы с готовыми решениями:
8
Максимально быстрый способ добавления миллионов объектов в коллекцию Событие передачи объектов в коллекцию Есть небольшая проблема. После добавления слов в коллекцию не переводит. Как исправить ошибку? Добавления нового человека |
65 / 65 / 16
Регистрация: 07.04.2014
Сообщений: 334
|
|
26.01.2015, 16:06 [ТС] | 3 |
Попробую объяснить.
Я принимаю сообщения от микроконтроллера. Вплоть до 1000 в секунду. Далее мне нужно их обрабатывать. Если я не буду вовремя забирать сообщения из программного буфера МК, то сообщения будут затираться. Обработка довольно ресурсоёмкая, поэтому я не могу обрабатывать сообщения на лету (точнее я это сейчас примерно и делаю в том виде который представлен выше, но после 400к сообщений накапливается запаздывание и сообщения в программном буфере начинают затираться выдавая ошибки переполнения. И это на core i7) Следовательно я решил записывать их в FIFO коллекцию и уже оттуда вытаскивать по одному и обрабатывать. Т.е. задача состоит в том чтобы не потерять сообщения от МК и постепенно их обработать и вывести результаты в том порядке в котором они приходили от МК. В том виде в каком программа дана выше коллекция бесполезна потому что в неё новое сообщение записывается только после завершения обработки, а если добавить доп. поток, то первая часть задачи выполняется и сообщения пишутся в коллекцию независимо, но ломается обработка, так как сообщения начинают обрабатываться вразнобой. посмотрю
0
|
65 / 65 / 16
Регистрация: 07.04.2014
Сообщений: 334
|
|
26.01.2015, 16:25 [ТС] | 5 |
Пробовал. Результат аналогичен созданию потока в обработчике события. Обработка и вывод сообщений будет идти не по порядку.
0
|
26.01.2015, 16:36 | 6 |
Тогда вам нужно сделать локальную очередь у каждого подписчика.
Подписчик принимает сообщение о новых данных и копирует принятые данные в свое FIFO (это будет быстро), а обрабатывает эту локальную очередь уже отдельный поток.
1
|
26.01.2015, 16:48 | 7 | ||||||||||
Сообщение было отмечено fidgi как решение
Решение
fidgi, если порядок обработки элементов критичен, то только однопоточный Поставщик-Потребитель поможет, ятд. Вот его классическая реализация (в однопоточном варианте)
Класс:
1
|
Master of Orion
|
|||||||||||
26.01.2015, 17:22 | 8 | ||||||||||
Добавлено через 26 минут Извиняюсь, там должно быть:
2
|
65 / 65 / 16
Регистрация: 07.04.2014
Сообщений: 334
|
|
26.01.2015, 17:27 [ТС] | 9 |
Спасибо за помощь! Сижу осознаю.
0
|
26.01.2015, 17:27 | |
26.01.2015, 17:27 | |
Помогаю со студенческими работами здесь
9
Добавления нового инстанса Макрос добавления нового Листа Метод добавления нового заказа Форма добавления нового пользователя Авторизация. проверка и добавления нового пользователя Добавления нового узла в дерево XML файла Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |