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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Эффективные межпотоковые стандартные коммуникации  (Прочитано 8634 раз)
Mikor
Гость
« : Декабрь 24, 2007, 22:45 »

Эффективные с точки зрения пропускной способности и нагрузки на основной поток.
Задача: надо из одного (не GUI) потока, передать в другой поток блоками здоровенный файл. Банальная попытка сделать это через SIGNAL/SLOT провалилась, т.к. передача всего этого шла через основной поток (т.к. SIGNAL при испускании лезет именно в основную очередь).
Так же очень неудобно вызывать в потоке exec для приема сигналов, т.к. требуется выполнять и другую фоновую работу, а делать это по таймерам - бред. Это всё загружает очередь основного потока и увеличивает время отклика приложения, что не желательно.
В Windows были замечательные объекты Event (которые можно было ставить в одном потоке, проверять состояние в другом, и ждать пока другой поток его поставит).
Кто что подскажет для реализации сего в Qt?
P.S. Передача проводилась кусками QByteArray (что должно быть эффективно с точки зрения экономии памяти).
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Декабрь 24, 2007, 22:59 »

Вопросик: А поток-приёмник не может читать сам файл? Допустим из потока-источника передаеться смещение и размер блока в файле, а поток-приёмник сам читает этот блок из файла.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Декабрь 24, 2007, 23:36 »

в Qt тоже есть QEvent, должно помочь...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Декабрь 25, 2007, 00:42 »

Можно также производить обмен через выделенную область памяти. Писать в неё данные и испускать сигнал на чтение данных. Только нужно не забывать об объектах синхронизации
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Mikor
Гость
« Ответ #4 : Декабрь 25, 2007, 02:56 »

QEvent совсем не то. Я о том, что очередь главного потока очень легко засоряется, если постоянно вызывать сигналы/слоты. Большой файл я привел как пример быстрого потока данных. Кому не нравится файл, представьте себе сокет.
Записан
ритт
Гость
« Ответ #5 : Декабрь 25, 2007, 03:04 »

представил себе сокет
какая должна быть скорость потока данных, чтобы _так_ засорить очередь сообщений, чтобы программа перестала откликаться?

обрисуй задачу более конкретно, чтобы не экстрасенсировать тут...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Декабрь 25, 2007, 03:46 »

QEvent совсем не то. Я о том, что очередь главного потока очень легко засоряется, если постоянно вызывать сигналы/слоты. Большой файл я привел как пример быстрого потока данных. Кому не нравится файл, представьте себе сокет.

Собственно говоря прозвучало уже несколько предложений. Реальзация и все предложения зависят от источника данных. Опишите что имено вам нужно: что и куда будет передаваться.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Mikor
Гость
« Ответ #7 : Декабрь 25, 2007, 05:50 »

Пускай это будет генератор случайных чисел создающий 10-20Мб в секунду в одном потоке, сохранение этого мусора в другом.
Дописал: программа откликается, но совсем не так быстро, как могла бы. Проц. двуядерный, основной поток работает на первом ядре, всё остальное на другом.
« Последнее редактирование: Декабрь 25, 2007, 05:54 от Mikor » Записан
Tonal
Гость
« Ответ #8 : Декабрь 25, 2007, 07:42 »

Вроде как "передавать блоки" нет нужды, т.к. потоки в одном приложении и память общая.
Если задача стоит так: есть поток генератьр и поток(и) получатель(и).
Тогда можно организовать очередь из блоков, доступ к которой контролируется QMutex-ом.
Если что-то сложнее - есть ещё например QReadWriteLock...
Записан
vaprele07
Гость
« Ответ #9 : Декабрь 25, 2007, 08:04 »

Если дело протекает на одной машине то кури:
http://www.opennet.ru/cgi-bin/opennet/man.cgi?topic=mmap&category=2
там все и синхронизация и етц..., это уж точно эффективнее с точки зрения всего, так как за все отвечает ОС а в кутэ есть класс пользующий их QSharedMemory называется начиная с 4.4 Улыбающийся
Записан
Вячеслав
Гость
« Ответ #10 : Декабрь 25, 2007, 08:15 »

представил себе сокет
какая должна быть скорость потока данных, чтобы _так_ засорить очередь сообщений, чтобы программа перестала откликаться?

обрисуй задачу более конкретно, чтобы не экстрасенсировать тут...
ГЫ Подмигивающий Плохо представил - тут вчера как раз одному товарисчу читал нотацию на эту тему - У нас на одной из железок на сокете висит хароооошая АЦП и при отлпдке используеться поток в районе 6 Гигабит .... Решение в лоб было - в потоке   читаем блок   , пихаем в другой сокет ( на вход ДСП) и читаем (в другом потоке) со входа ДСП данные ,которые Eventom перекидывались на график ...... В общем АМД с 2 гигами памяти сдох сразу ( слайд шоу) ,Intel работал нормально (почти) но все-равно весело Подмигивающий Сокеты рааазные бывают Подмигивающий
Записан
Mikor
Гость
« Ответ #11 : Декабрь 25, 2007, 14:06 »

Плохо у мя с русским. Вопрос не в том, как передать данные ) QMutex'ом QList<QByteArray> защитить не проблема. Проблема в передаче во второй поток сообщения о том, что к нему в список уже пришло List::size() буферов и пора бы уже всё обработать )) А, размер буфера у мя 20кБ (ну чтобы буферов мнооого было)
Записан
Tonal
Гость
« Ответ #12 : Декабрь 25, 2007, 14:48 »

Можно вообще без сообщений: кури QWaitCondition.
Записан
Gryz
Гость
« Ответ #13 : Декабрь 25, 2007, 15:00 »

Кажется, что это классическая задача http://www.crossplatform.ru/?q=node/313 смотреть Example: Bounded Buffers
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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