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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигналы и производительность  (Прочитано 4373 раз)
once_again_abc
Гость
« : Сентябрь 01, 2011, 07:59 »

Вопрос такой. Есть два потока. Первый поток обслуживает GUI, второй снабжает этот ГУИ данными через общую память. Сейчас реализовано уведомление через сигнал (поток1) - слот (поток2). При этом, с частотой сообщений 10мс. процессорное время всего приложения где-то 6-10%, что мне не очень нравится. Хотелось бы знать, есть ли механизмы нотификации, не требующие так много ресурсов?

Если один поток вынужден _очень_ часто тревожить второй поток, то какой вы подход используете?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Сентябрь 01, 2011, 08:57 »

да в принципе можно с condvar реализовать, у меня была подобная задача но не в qt, так я там сделал на парных сокетах, работает очень быстро.
еще можете попробовать по изменять флаги в connect(), например Qt::DirectConnection.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентябрь 01, 2011, 09:45 »

Стоит попробовать на семафорах - тоже производительностью не блещут но побыстрее чем сигналы через очередь
Записан
once_again_abc
Гость
« Ответ #3 : Сентябрь 01, 2011, 10:09 »

Стоит попробовать на семафорах - тоже производительностью не блещут но побыстрее чем сигналы через очередь

обязательно попробую семафоры, спасибо
Записан
once_again_abc
Гость
« Ответ #4 : Сентябрь 01, 2011, 10:10 »

да в принципе можно с condvar реализовать, у меня была подобная задача но не в qt, так я там сделал на парных сокетах, работает очень быстро.
еще можете попробовать по изменять флаги в connect(), например Qt::DirectConnection.

не поделитесь общей схемой использования парных сокетов? и что за condvar  вы имеете ввиду? это кросс-платформенная штука? для меня это очень важно.
Записан
Akon
Гость
« Ответ #5 : Сентябрь 01, 2011, 11:38 »

Сами сигналы ресурсов потребляют пренебрежимо мало, по крайней мере с вашим периодом генерации в 10 мс. Скорее всего, ресурсы потребляются из-за того, что гуй обновляется по тычкам через каждые 10 мс.
« Последнее редактирование: Сентябрь 01, 2011, 11:43 от Akon » Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #6 : Сентябрь 01, 2011, 15:23 »

Сами сигналы ресурсов потребляют пренебрежимо мало, по крайней мере с вашим периодом генерации в 10 мс. Скорее всего, ресурсы потребляются из-за того, что гуй обновляется по тычкам через каждые 10 мс.

+1. Скорее всего так оно и есть.

Можешь проредить срабатывания сигнала, например, вот с помощью моего класса - http://www.prog.org.ru/topic_15938_0.html
Записан

Гугль в помощь
once_again_abc
Гость
« Ответ #7 : Сентябрь 02, 2011, 01:26 »

Сами сигналы ресурсов потребляют пренебрежимо мало, по крайней мере с вашим периодом генерации в 10 мс. Скорее всего, ресурсы потребляются из-за того, что гуй обновляется по тычкам через каждые 10 мс.

предлагаете ставить sleep(x) =)))
как же решаются задачи быстрой перерисовки? тем более когда речь идет о небольшом сегменте

ПС. хочу уточнить - рисую в пиксмапе, который передаю ГУИ через фиксированный указатель и прошу ГУИ update()-ом перерисвать определенную небольшую область этим пиксмапом через drawPixmap.
Записан
Akon
Гость
« Ответ #8 : Сентябрь 02, 2011, 10:57 »

О sleep() даже мыслей не было. Ссылка выше - то, что нужно.

Достаточно приемлемой перерисовки, сопоставимой с реакцией человеческого глаза. 10 мс - это 100 Гц; ЖК монитор обновляется с меньшей частотой.

В современных Qt-ях у виджетов есть двойная буферизация, так что можно рисовать прямо по виджетам. Если обновляешь через update(), т.е. асинхронно, то перед отрисовкой виджета все события "складываются" (получается объединенная область), и отрисовка будет однократной. Указывай в update() область отрисовки.
Записан
once_again_abc
Гость
« Ответ #9 : Сентябрь 02, 2011, 11:51 »

О sleep() даже мыслей не было. Ссылка выше - то, что нужно.

Достаточно приемлемой перерисовки, сопоставимой с реакцией человеческого глаза. 10 мс - это 100 Гц; ЖК монитор обновляется с меньшей частотой.

В современных Qt-ях у виджетов есть двойная буферизация, так что можно рисовать прямо по виджетам. Если обновляешь через update(), т.е. асинхронно, то перед отрисовкой виджета все события "складываются" (получается объединенная область), и отрисовка будет однократной. Указывай в update() область отрисовки.

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


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