Название: Эффективные межпотоковые стандартные коммуникации Отправлено: Mikor от Декабрь 24, 2007, 22:45 Эффективные с точки зрения пропускной способности и нагрузки на основной поток.
Задача: надо из одного (не GUI) потока, передать в другой поток блоками здоровенный файл. Банальная попытка сделать это через SIGNAL/SLOT провалилась, т.к. передача всего этого шла через основной поток (т.к. SIGNAL при испускании лезет именно в основную очередь). Так же очень неудобно вызывать в потоке exec для приема сигналов, т.к. требуется выполнять и другую фоновую работу, а делать это по таймерам - бред. Это всё загружает очередь основного потока и увеличивает время отклика приложения, что не желательно. В Windows были замечательные объекты Event (которые можно было ставить в одном потоке, проверять состояние в другом, и ждать пока другой поток его поставит). Кто что подскажет для реализации сего в Qt? P.S. Передача проводилась кусками QByteArray (что должно быть эффективно с точки зрения экономии памяти). Название: Re: Эффективные межпотоковые стандартные коммуникации Отправлено: pastor от Декабрь 24, 2007, 22:59 Вопросик: А поток-приёмник не может читать сам файл? Допустим из потока-источника передаеться смещение и размер блока в файле, а поток-приёмник сам читает этот блок из файла.
Название: Re: Эффективные межпотоковые стандартные коммуникации Отправлено: Racheengel от Декабрь 24, 2007, 23:36 в Qt тоже есть QEvent, должно помочь...
Название: Re: Эффективные межпотоковые стандартные коммуникации Отправлено: pastor от Декабрь 25, 2007, 00:42 Можно также производить обмен через выделенную область памяти. Писать в неё данные и испускать сигнал на чтение данных. Только нужно не забывать об объектах синхронизации
Название: Re: Эффективные межпотоковые стандартные коммуникации Отправлено: Mikor от Декабрь 25, 2007, 02:56 QEvent совсем не то. Я о том, что очередь главного потока очень легко засоряется, если постоянно вызывать сигналы/слоты. Большой файл я привел как пример быстрого потока данных. Кому не нравится файл, представьте себе сокет.
Название: Re: Эффективные межпотоковые стандартные коммуникации Отправлено: ритт от Декабрь 25, 2007, 03:04 представил себе сокет
какая должна быть скорость потока данных, чтобы _так_ засорить очередь сообщений, чтобы программа перестала откликаться? обрисуй задачу более конкретно, чтобы не экстрасенсировать тут... Название: Re: Эффективные межпотоковые стандартные коммуникации Отправлено: pastor от Декабрь 25, 2007, 03:46 QEvent совсем не то. Я о том, что очередь главного потока очень легко засоряется, если постоянно вызывать сигналы/слоты. Большой файл я привел как пример быстрого потока данных. Кому не нравится файл, представьте себе сокет. Собственно говоря прозвучало уже несколько предложений. Реальзация и все предложения зависят от источника данных. Опишите что имено вам нужно: что и куда будет передаваться. Название: Re: Эффективные межпотоковые стандартные коммуникации Отправлено: Mikor от Декабрь 25, 2007, 05:50 Пускай это будет генератор случайных чисел создающий 10-20Мб в секунду в одном потоке, сохранение этого мусора в другом.
Дописал: программа откликается, но совсем не так быстро, как могла бы. Проц. двуядерный, основной поток работает на первом ядре, всё остальное на другом. Название: Re: Эффективные межпотоковые стандартные коммуникации Отправлено: Tonal от Декабрь 25, 2007, 07:42 Вроде как "передавать блоки" нет нужды, т.к. потоки в одном приложении и память общая.
Если задача стоит так: есть поток генератьр и поток(и) получатель(и). Тогда можно организовать очередь из блоков, доступ к которой контролируется QMutex-ом. Если что-то сложнее - есть ещё например QReadWriteLock... Название: Re: Эффективные межпотоковые стандартные коммуникации Отправлено: vaprele07 от Декабрь 25, 2007, 08:04 Если дело протекает на одной машине то кури:
http://www.opennet.ru/cgi-bin/opennet/man.cgi?topic=mmap&category=2 там все и синхронизация и етц..., это уж точно эффективнее с точки зрения всего, так как за все отвечает ОС а в кутэ есть класс пользующий их QSharedMemory называется начиная с 4.4 :) Название: Re: Эффективные межпотоковые стандартные коммуникации Отправлено: Вячеслав от Декабрь 25, 2007, 08:15 представил себе сокет ГЫ ;) Плохо представил - тут вчера как раз одному товарисчу читал нотацию на эту тему - У нас на одной из железок на сокете висит хароооошая АЦП и при отлпдке используеться поток в районе 6 Гигабит .... Решение в лоб было - в потоке читаем блок , пихаем в другой сокет ( на вход ДСП) и читаем (в другом потоке) со входа ДСП данные ,которые Eventom перекидывались на график ...... В общем АМД с 2 гигами памяти сдох сразу ( слайд шоу) ,Intel работал нормально (почти) но все-равно весело ;) Сокеты рааазные бывают ;) какая должна быть скорость потока данных, чтобы _так_ засорить очередь сообщений, чтобы программа перестала откликаться? обрисуй задачу более конкретно, чтобы не экстрасенсировать тут... Название: Re: Эффективные межпотоковые стандартные коммуникации Отправлено: Mikor от Декабрь 25, 2007, 14:06 Плохо у мя с русским. Вопрос не в том, как передать данные ) QMutex'ом QList<QByteArray> защитить не проблема. Проблема в передаче во второй поток сообщения о том, что к нему в список уже пришло List::size() буферов и пора бы уже всё обработать )) А, размер буфера у мя 20кБ (ну чтобы буферов мнооого было)
Название: Re: Эффективные межпотоковые стандартные коммуникации Отправлено: Tonal от Декабрь 25, 2007, 14:48 Можно вообще без сообщений: кури QWaitCondition.
Название: Re: Эффективные межпотоковые стандартные коммуникации Отправлено: Gryz от Декабрь 25, 2007, 15:00 Кажется, что это классическая задача http://www.crossplatform.ru/?q=node/313 смотреть Example: Bounded Buffers
|