crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Попиксельное заполнение буфера
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  


Цитата(loh @ 24.12.2011, 22:13) *
ок, я так и делал, а мьютексы делать?
А как иначе ты думаешь организовать синхронизацию?
Цитата(loh @ 24.12.2011, 22:13) *
кроме как в 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?

ок, с синхронизацией понятно :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.4.2024, 5:34