Попиксельное заполнение буфера |
Здравствуйте, гость ( Вход | Регистрация )
Попиксельное заполнение буфера |
loh |
21.12.2011, 16:37
Сообщение
#1
|
Студент Группа: Участник Сообщений: 60 Регистрация: 11.5.2008 Пользователь №: 171 Спасибо сказали: 0 раз(а) Репутация: 0 |
Всем привет!
Задача такая, у меня есть датчик, типа линейного сканера, от него приходят данные представляющие собой двух байтные числа которые после некоторой математической обработки связанной с операциями сложения умножения деления вычитается превращаются либо в цвет точки. соответственно один пакет этих чисел это одна колонка пикселей на экране. Каждая новая колонка приходит на место старой, а вся картинка смещается на один пиксел в сторону. Проблема в том что частота прихода этих пакетов высокая - например 200 пакетов в секунду, Так вот! как организовать буфер для сохранения исходных значений с датчика, буфер с обработанными значениями для вывода на экран, как синхронизировать вывод с приёмом, что бы картинка смешалась плавно, без рывков? И как сделать быструю обработку исходных значений для преобразования их в цвет уже в офлайн режиме, когда данные берутся не с датчика, а с буфера исходных данных? :о |
|
|
ViGOur |
24.12.2011, 10:32
Сообщение
#2
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Ну как я понимаю для это тебе нужно 3 потока и два буфера:
1. Поток сохраняющий исходные значения датчика в общий буфер №1. 2. Поток обрабатывающий значения из буфера №1 и кладущий результат работы в буфер №2 . 3. Основной, в котором будет идти рисование картинки, из общего буфера №2. Схему думаю можно устроить такую: поступили данные, которые были положены 1 потоком в некий общий буфер №1, 2 поток "обнаружив данные" обработал их и положил в буфер №2 , после чего отправил основному потоку сигнал, что есть данные для отрисовки, которые основной поток берет из буфера №1... Тебе нужно только правильно синхронизировать, и блокировать тот или иной буфер только на момент обращения к нему и не более того. И всё должно быть нормально! |
|
|
loh |
24.12.2011, 12:34
Сообщение
#3
|
Студент Группа: Участник Сообщений: 60 Регистрация: 11.5.2008 Пользователь №: 171 Спасибо сказали: 0 раз(а) Репутация: 0 |
я так пробовал, там какая сложность была: чтобы вывод равномерный был я сделал цикл во втором потоке, по которому записывалось какое то фиксированное число значений из буфера 1, через фиксированное число миллисекунд, и отправлял данные на отображение. но так как в буфер 1 заполняется не равномерно, то за этот период могло быть заполнено либо больше либо меньше чем требовалось данных, пробовал менять параметры цикла частоту и размер копируемых данных, но все равно 2 буфер "съезжал" относительно первого через некоторое время
может быть куда то ещё этот цикл добавить? в основном потоке такой цикл кажется будет тормозить всю программу.. |
|
|
ViGOur |
24.12.2011, 13:22
Сообщение
#4
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Никаких циклов!
Пришли данные для буфера №1, если данных достаточно для обработки вторым потоком, отправляется сигнал, чтобы второй поток их получил. Второй поток, после того как получил сигнал обрабатывает данные и заполняет буфера №2, если данных достаточно для отрисовки, он отправляет сигнал основному потоку, который в свою очередь всё это отрисовывает. И никаких циклов, слипов и прочего. Просто обычная работа с сигналами и слотами и не более того! Или ты просто не понимаешь как работают потоки и сигналы и слоты в Qt? Имеется ввиду, тебе ведь просто нужно создать два потока, в которых создать по объекту класса обработчика, которые к тому же будут отправлять-принимать сигналы, а сами потоки в это время будут просто висеть и ожидать самих сигналов! Если нет данных, потоки ничего не делают и не нагружают систему, есть - работают в нужный момент... |
|
|
loh |
24.12.2011, 17:12
Сообщение
#5
|
Студент Группа: Участник Сообщений: 60 Регистрация: 11.5.2008 Пользователь №: 171 Спасибо сказали: 0 раз(а) Репутация: 0 |
так я кажется пробовал тоже, и тогда это всё как-то то ли тормозило то ли не равномерно выводилось, я решил что сигнал-слот недостаточно быстрый способ взаимодействия (тоесть система правильно работала только при не достаточно высокой частоте сигналов с датчика), впрочем надо попробовать ещё, конечно, может быть я стал умнее..
а в каком виде отправлять данные в сигналах от потока 1 в поток 2? qbytearray и qlist? они медленные вроде.. динамический массив? тогда он вроде будет принадлежать потоку 1? в каком виде отправлять данные в сигнале от потока 2 в основной поток для рисования (допустим получается матрица 1000 на 1000, qcolor, это не меньше 4 байт, тоесть 4 мегабайта надо отправить, и так раз 30 в секунду чтобы рывков заметно не было О_О) можно ли таким образом рисовать не в стандартных окошках, а в qgraphicsitem? |
|
|
ViGOur |
24.12.2011, 19:33
Сообщение
#6
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
А если у тебя поток данных вырастет ещё раз в 100, так же будешь передавать?
Сигналом ты просто говоришь, что нужно обработать некий буфер №1, сам буфер передавать не нужно сделай его глобальным! Например, чтобы сообщить основному потоку о том, что нужно перерисовать окно не нужно ему передавать какие-либо данные кроме как просто сообщить, что нужно перерисовать. А вот уже сама функция перерисовки пускай сама разбирается, где ей брать данные для рисования! А именно, буфер №2! |
|
|
loh |
24.12.2011, 21:13
Сообщение
#7
|
Студент Группа: Участник Сообщений: 60 Регистрация: 11.5.2008 Пользователь №: 171 Спасибо сказали: 0 раз(а) Репутация: 0 |
ок, я так и делал, а мьютексы делать?
а, да, и ещё по отображению, кроме как в qpainter рисовать qimage который из массива qRgb* значений получается можно как то отрисовать попиксельно содержимое окна? ну через qpainter, но как нибудь напрямую без qimage? |
|
|
ViGOur |
24.12.2011, 22:56
Сообщение
#8
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
ок, я так и делал, а мьютексы делать? А как иначе ты думаешь организовать синхронизацию?кроме как в qpainter рисовать qimage который из массива qRgb* значений получается можно как то отрисовать попиксельно содержимое окна? Чем тебя не устраивает стандартное рисование?
ну через qpainter, но как нибудь напрямую без qimage? |
|
|
BlueIceScream |
24.12.2011, 23:04
Сообщение
#9
|
Студент Группа: Участник Сообщений: 56 Регистрация: 21.11.2011 Из: Республика Дагестан Пользователь №: 3016 Спасибо сказали: 18 раз(а) Репутация: 3 |
Для правильной реализации решения задачи производитель - потребитель (Producer - Consumer) Qt предоставляет классы:
1) QWaitCondition и QMutex 2) QSemaphore Для обоих методов есть готовые примеры вместе с Qt: 1) Wait Conditions Example 2) Semaphores Example |
|
|
loh |
24.12.2011, 23:42
Сообщение
#10
|
Студент Группа: Участник Сообщений: 60 Регистрация: 11.5.2008 Пользователь №: 171 Спасибо сказали: 0 раз(а) Репутация: 0 |
ну мне кажется qimage какое то лишнее звено которое тоже тратит память лишнюю? вот нельзя как нибудь qpainterом рисовать массив char* (или какой другой массив) не создавая qimage?
ок, с синхронизацией понятно |
|
|
Текстовая версия | Сейчас: 26.11.2024, 17:08 |