Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: once_again_abc от Сентябрь 01, 2011, 07:59



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

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


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


Название: Re: Сигналы и производительность
Отправлено: Igors от Сентябрь 01, 2011, 09:45
Стоит попробовать на семафорах - тоже производительностью не блещут но побыстрее чем сигналы через очередь


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

обязательно попробую семафоры, спасибо


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

не поделитесь общей схемой использования парных сокетов? и что за condvar  вы имеете ввиду? это кросс-платформенная штука? для меня это очень важно.


Название: Re: Сигналы и производительность
Отправлено: Akon от Сентябрь 01, 2011, 11:38
Сами сигналы ресурсов потребляют пренебрежимо мало, по крайней мере с вашим периодом генерации в 10 мс. Скорее всего, ресурсы потребляются из-за того, что гуй обновляется по тычкам через каждые 10 мс.


Название: Re: Сигналы и производительность
Отправлено: navrocky от Сентябрь 01, 2011, 15:23
Сами сигналы ресурсов потребляют пренебрежимо мало, по крайней мере с вашим периодом генерации в 10 мс. Скорее всего, ресурсы потребляются из-за того, что гуй обновляется по тычкам через каждые 10 мс.

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

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


Название: Re: Сигналы и производительность
Отправлено: once_again_abc от Сентябрь 02, 2011, 01:26
Сами сигналы ресурсов потребляют пренебрежимо мало, по крайней мере с вашим периодом генерации в 10 мс. Скорее всего, ресурсы потребляются из-за того, что гуй обновляется по тычкам через каждые 10 мс.

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

ПС. хочу уточнить - рисую в пиксмапе, который передаю ГУИ через фиксированный указатель и прошу ГУИ update()-ом перерисвать определенную небольшую область этим пиксмапом через drawPixmap.


Название: Re: Сигналы и производительность
Отправлено: Akon от Сентябрь 02, 2011, 10:57
О sleep() даже мыслей не было. Ссылка выше - то, что нужно.

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

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


Название: Re: Сигналы и производительность
Отправлено: once_again_abc от Сентябрь 02, 2011, 11:51
О sleep() даже мыслей не было. Ссылка выше - то, что нужно.

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

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

Спасибо!