Russian Qt Forum
Ноябрь 24, 2024, 23:39
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Эффективные межпотоковые стандартные коммуникации
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Эффективные межпотоковые стандартные коммуникации (Прочитано 8632 раз)
Mikor
Гость
Эффективные межпотоковые стандартные коммуникации
«
:
Декабрь 24, 2007, 22:45 »
Эффективные с точки зрения пропускной способности и нагрузки на основной поток.
Задача: надо из одного (не GUI) потока, передать в другой поток блоками здоровенный файл. Банальная попытка сделать это через SIGNAL/SLOT провалилась, т.к. передача всего этого шла через основной поток (т.к. SIGNAL при испускании лезет именно в основную очередь).
Так же очень неудобно вызывать в потоке exec для приема сигналов, т.к. требуется выполнять и другую фоновую работу, а делать это по таймерам - бред. Это всё загружает очередь основного потока и увеличивает время отклика приложения, что не желательно.
В Windows были замечательные объекты Event (которые можно было ставить в одном потоке, проверять состояние в другом, и ждать пока другой поток его поставит).
Кто что подскажет для реализации сего в Qt?
P.S. Передача проводилась кусками QByteArray (что должно быть эффективно с точки зрения экономии памяти).
Записан
pastor
Administrator
Джедай : наставник для всех
Offline
Сообщений: 2901
Re: Эффективные межпотоковые стандартные коммуникации
«
Ответ #1 :
Декабрь 24, 2007, 22:59 »
Вопросик: А поток-приёмник не может читать сам файл? Допустим из потока-источника передаеться смещение и размер блока в файле, а поток-приёмник сам читает этот блок из файла.
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Эффективные межпотоковые стандартные коммуникации
«
Ответ #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
Сообщений: 2901
Re: Эффективные межпотоковые стандартные коммуникации
«
Ответ #3 :
Декабрь 25, 2007, 00:42 »
Можно также производить обмен через выделенную область памяти. Писать в неё данные и испускать сигнал на чтение данных. Только нужно не забывать об объектах синхронизации
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Mikor
Гость
Re: Эффективные межпотоковые стандартные коммуникации
«
Ответ #4 :
Декабрь 25, 2007, 02:56 »
QEvent совсем не то. Я о том, что очередь главного потока очень легко засоряется, если постоянно вызывать сигналы/слоты. Большой файл я привел как пример быстрого потока данных. Кому не нравится файл, представьте себе сокет.
Записан
ритт
Гость
Re: Эффективные межпотоковые стандартные коммуникации
«
Ответ #5 :
Декабрь 25, 2007, 03:04 »
представил себе сокет
какая должна быть скорость потока данных, чтобы _так_ засорить очередь сообщений, чтобы программа перестала откликаться?
обрисуй задачу более конкретно, чтобы не экстрасенсировать тут...
Записан
pastor
Administrator
Джедай : наставник для всех
Offline
Сообщений: 2901
Re: Эффективные межпотоковые стандартные коммуникации
«
Ответ #6 :
Декабрь 25, 2007, 03:46 »
Цитата: Mikor от Декабрь 25, 2007, 02:56
QEvent совсем не то. Я о том, что очередь главного потока очень легко засоряется, если постоянно вызывать сигналы/слоты. Большой файл я привел как пример быстрого потока данных. Кому не нравится файл, представьте себе сокет.
Собственно говоря прозвучало уже несколько предложений. Реальзация и все предложения зависят от источника данных. Опишите что имено вам нужно: что и куда будет передаваться.
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Mikor
Гость
Re: Эффективные межпотоковые стандартные коммуникации
«
Ответ #7 :
Декабрь 25, 2007, 05:50 »
Пускай это будет генератор случайных чисел создающий 10-20Мб в секунду в одном потоке, сохранение этого мусора в другом.
Дописал: программа откликается, но совсем не так быстро, как могла бы. Проц. двуядерный, основной поток работает на первом ядре, всё остальное на другом.
«
Последнее редактирование: Декабрь 25, 2007, 05:54 от Mikor
»
Записан
Tonal
Гость
Re: Эффективные межпотоковые стандартные коммуникации
«
Ответ #8 :
Декабрь 25, 2007, 07:42 »
Вроде как "передавать блоки" нет нужды, т.к. потоки в одном приложении и память общая.
Если задача стоит так: есть поток генератьр и поток(и) получатель(и).
Тогда можно организовать очередь из блоков, доступ к которой контролируется QMutex-ом.
Если что-то сложнее - есть ещё например QReadWriteLock...
Записан
vaprele07
Гость
Re: Эффективные межпотоковые стандартные коммуникации
«
Ответ #9 :
Декабрь 25, 2007, 08:04 »
Если дело протекает на одной машине то кури:
http://www.opennet.ru/cgi-bin/opennet/man.cgi?topic=mmap&category=2
там все и синхронизация и етц..., это уж точно эффективнее с точки зрения всего, так как за все отвечает ОС а в кутэ есть класс пользующий их QSharedMemory называется начиная с 4.4
Записан
Вячеслав
Гость
Re: Эффективные межпотоковые стандартные коммуникации
«
Ответ #10 :
Декабрь 25, 2007, 08:15 »
Цитата: xep от Декабрь 25, 2007, 03:04
представил себе сокет
какая должна быть скорость потока данных, чтобы _так_ засорить очередь сообщений, чтобы программа перестала откликаться?
обрисуй задачу более конкретно, чтобы не экстрасенсировать тут...
ГЫ
Плохо представил - тут вчера как раз одному товарисчу читал нотацию на эту тему - У нас на одной из железок на сокете висит хароооошая АЦП и при отлпдке используеться поток в районе 6 Гигабит .... Решение в лоб было - в потоке читаем блок , пихаем в другой сокет ( на вход ДСП) и читаем (в другом потоке) со входа ДСП данные ,которые Eventom перекидывались на график ...... В общем АМД с 2 гигами памяти сдох сразу ( слайд шоу) ,Intel работал нормально (почти) но все-равно весело
Сокеты рааазные бывают
Записан
Mikor
Гость
Re: Эффективные межпотоковые стандартные коммуникации
«
Ответ #11 :
Декабрь 25, 2007, 14:06 »
Плохо у мя с русским. Вопрос не в том, как передать данные ) QMutex'ом QList<QByteArray> защитить не проблема. Проблема в передаче во второй поток сообщения о том, что к нему в список уже пришло List::size() буферов и пора бы уже всё обработать )) А, размер буфера у мя 20кБ (ну чтобы буферов мнооого было)
Записан
Tonal
Гость
Re: Эффективные межпотоковые стандартные коммуникации
«
Ответ #12 :
Декабрь 25, 2007, 14:48 »
Можно вообще без сообщений: кури QWaitCondition.
Записан
Gryz
Гость
Re: Эффективные межпотоковые стандартные коммуникации
«
Ответ #13 :
Декабрь 25, 2007, 15:00 »
Кажется, что это классическая задача
http://www.crossplatform.ru/?q=node/313
смотреть Example: Bounded Buffers
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...