Название: Сигналы и производительность Отправлено: 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() область отрисовки. Спасибо! |