Russian Qt Forum
Октябрь 04, 2024, 02:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: архитектура producer & consumer threads  (Прочитано 3168 раз)
svetocopy
Гость
« : Январь 24, 2013, 13:51 »

Здравствуйте! Не могу найти оптимальное решение для моей проблемы, поэтому обращаюсь за советом как грамотно построить архитектуру приложения.
В общем ситуация такая: producer thread производит данные (читает данные с сетевухи. после того, как пакеты соберутся выходная информация представляет собой uchar массив размером 3000 байт), consumer thread эти данные обрабатывает. Требуется эти два потока как-то состыковать, чтобы producer не терял пакеты и consumer своевременно обрабатывал.
Я пытался складывать данные в циркулярный буфер на семафорах (см. пример Qt) и потом в потоке обработке считывать, но это решение грузит процессор , относительно конечно, но для моей задачи процент загрузки не приемлим.
Можно ли слать данные сигналом и как в таком случае быть уверенным, что все данные автоматически встанут в очередь и не потеряются?
Как грамотно решаются подобные задачи? Заранее спасибо!.

upd. время обработки данных является не постоянной величиной
« Последнее редактирование: Январь 24, 2013, 14:04 от svetocopy » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Январь 24, 2013, 15:00 »

С сигналами писать (значительно) легче но быстрее это быть никак не должно. Др стандартная техника - использование QWaitCodition. В принципе в Qt все синхронизации реализованы на одних и тех же базовых примитивах ОС, поэтому шансов обогнать circular buffer немного. Больше подробностей загрузки и др - тогда возможно будет больше советов.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Январь 24, 2013, 15:05 »

Я пытался складывать данные в циркулярный буфер на семафорах (см. пример Qt) и потом в потоке обработке считывать, но это решение грузит процессор , относительно конечно, но для моей задачи процент загрузки не приемлим.
Покажи, как ты делал и попробуем исправить.
Записан
svetocopy
Гость
« Ответ #3 : Январь 25, 2013, 13:13 »

Здравствуйте! Не могу найти оптимальное решение для моей проблемы, поэтому обращаюсь за советом как грамотно построить архитектуру приложения.
В общем ситуация такая: producer thread производит данные (читает данные с сетевухи. после того, как пакеты соберутся выходная информация представляет собой uchar массив размером 3000 байт), consumer thread эти данные обрабатывает. Требуется эти два потока как-то состыковать, чтобы producer не терял пакеты и consumer своевременно обрабатывал.
Я пытался складывать данные в циркулярный буфер на семафорах (см. пример Qt) и потом в потоке обработке считывать, но это решение грузит процессор , относительно конечно, но для моей задачи процент загрузки не приемлим.
Можно ли слать данные сигналом и как в таком случае быть уверенным, что все данные автоматически встанут в очередь и не потеряются?
Как грамотно решаются подобные задачи? Заранее спасибо!.

upd. время обработки данных является не постоянной величиной
Ребята, всем огромное спасибо! Я во всем разобрался.

Со мной случился синдром ночного программирования, сжатые сроки и объем проекта сделали свое дело. Оказалось вообще в стороннем модуле программы, который я отключил на время отладки, одна из функция висела в busy wait - захватывала и освобождала мьютекс, и когда настала пора собирать проект в кучу, то про нее я напрочь забыл. Она то и грузила процессор.

А так решение сделать круговой буфер на семафорах оказалось вполне приемлимым.


Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.166 секунд. Запросов: 23.