LINUX.ORG.RU

Qt, ну так не пойдет...

 


2

5

Короче есть QTimeEdit.

Когда его редактируешь с клавиатуры — если удерживать клавишу-стрелку и долго не отпускать — оно эмитит огромное кол-во сигналов timeChanged() эти сигналы скапливаются в очередь и сам таймэдит начинает тормозить и все медленнее обновляет значение у себя. У меня даже кулер подразгоняется от этого.

И это я уже отнаследовался, повесил на это говно в свой слот и не пущщаю ничего наружу, а эмичу свой сигнал, когда оно успокоится (типа debounce). Т.е. вся эта говнина эмитит свои сигналы локально внутри самого экземпляра и создает там FIFO очередь, которая начинает страшно тупить.

Ну и что делать? Как очистить очередь этих сигналов? Или как запретить эмитить их так часто?

Ответ на: комментарий от deep-purple

когда один виджет — не тормозит

Значит в «большом» приложении ты влез в обработку событий клавиатуры и где-то их множишь - еще до виджета.

anonymous
()
Ответ на: комментарий от anonymous

Или переопределен QApplication::notify, или eventFilter где-то стоит, и там выполняется какая-то работа для всех проходящих событий

annulen ★★★★★
()
Ответ на: комментарий от anonymous

В том то и дело, что текущая реализация с большой интенсивностью сигналов мне не подходит и в моем случае косячит. Если бы была какая-то опция настройки частоты испускания сигналов — этот тред я бы и не создавал. По сути, оно работает правильно, просто в моем случае не подходит.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от unC0Rr

Точно нет. Коннект единственный и только в том месте где вставляется этот элемент. Кстати, та же проблема есть и у спинбоксов.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от anonymous

И annulen.

Вот это уже интересные предположения.

Насчет обработки событий клавы — да, майнвиндоу ловит горячие клавиши. Тогда, допустим, вопрос — как правильно запретить распространение клавишных ивентов наружу из этого элемента?

Насчет QApplication::notify и eventFilter — нигде не используется вообще.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от annulen

Ок. Посоветуй профайлер, по возможности, так чтобы и на слабом, старом ноуте можно было дождаться результата профилирования (я просто в основном за ним работаю, лёжа, удобнее типа).

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Лежа нормального результата не получить, инфа 100%

Если с callgrind настолько большое замедление, что это составляет проблему, то имеет смысл использовать perf или oprofile

annulen ★★★★★
()
Ответ на: комментарий от annulen

Эм, ну, такова жизнь (в моем случае, юольшого компа нет под рукой всегда). Спасибо! Проверю все перечисленные.

Немного оффтоп: а ты чего не спишь уже в который раз так поздно? Я то просто сова и у меня сейчас есть возможность работать ночами.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Че-то с этими праздниками поломал режим дня, никак не въеду обратно

annulen ★★★★★
()
Ответ на: комментарий от annulen

Вобщем результаты тестов на просто всунутом QTimeEdit:

1) callgrind (kcachegrind) говорит что самый тупняк в QEventLoop::processEvents()

2) perf top говорит что самый тупняк в _int_malloc

3) perf trace начинает флудить вызовами open, mmap, stat, close. Там есть и просто указатели и пути к файлам X11, которые открываются, статятся, мапятся и закрываются (но в своем коде я НИГДЕ такого не делаю вообще). Почти(!) все «указателевые» попытки делают это с errno, а иксовые файлы все в наличии и ошибок нет. Смущает, что происходит это на каждый chnged-сигнал от виджета (который, напомню, просто эмитит сигнал, на который НЕ подписан НИ один слот). Во время флуда иногда проскакивает, а после флуда полностью просыпается чья-то (почти уверен что qt-шная) запоздавшая poll-«рассылка».

Мысль — отрубить ВСЁ и постепенно включать пока тест не покажет появления этих тормозов. Ничего умнее в голову не приходит.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Куда копать дальше?

В профилирование. Смотреть что именно тормозит.

peregrine ★★★★★
()
Ответ на: комментарий от deep-purple

на просто всунутом QTimeEdit

Это что значит? Надо приложение которое тормозит профилировать, в тесте у тебя производительность была нормальной => ты скорее всего не найдешь ничего относящегося к делу

annulen ★★★★★
()
Ответ на: комментарий от deep-purple

perf top говорит что самый тупняк в _int_malloc

callgraph включай, без него неинформативно. возмонжо придется пересобрать с чем-нить вроде -g -fno-omit-frame-pointer

annulen ★★★★★
()
Ответ на: комментарий от deep-purple

Смущает, что происходит это на каждый chnged-сигнал от виджета (который, напомню, просто эмитит сигнал, на который НЕ подписан НИ один слот).

gdb, b mmap, bt

Конечно, без debuginfo для Qt и иксовых библиотек далеко не уедешь. Выглядит как баг или архитектурный просчет в Qt.

kawaii_neko ★★★★
()
Ответ на: комментарий от annulen

Это что значит?

Подключенный ведет себя так же.

возмонжо придется пересобрать

Для теста пересобрано с "-g -O0" и конечно же «CONFIG += debug» в *.pro

А о каких файлах X11 идет речь?

/usr/share/X11/xkb/*/*

deep-purple ★★★★★
() автор топика
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от deep-purple

-O0 профилировать бессмысленно. И сборка Qt должна быть релизной, а то можно и не такого насмотреться

annulen ★★★★★
()
Ответ на: комментарий от deep-purple

Если что, удалить ноль недостаточно, так как это дефолтный вариант :)

annulen ★★★★★
()
Ответ на: комментарий от peregrine

Потому что это такой же сэплирующий профайлер как и perf, только при этом требует пересборки всех бибилотек со своим флагом, тогда как perf профилирует немодифицированный код (ок, для получения качественных бэктрейсов требуется модификация, но это не обязательно, а gprof этого вообще не умеет)

А если ты питаешь иллюзии, что gprof показывает реальное время выполнения функций, то это не так, это просто некоторые «попугаи». Для получения времени нужно обложиться lttng и TraceCompass, см. например https://wiki.ubuntu.com/Touch/LTTNG profiling

annulen ★★★★★
()
Ответ на: комментарий от annulen

Нет, я как раз про то, что если проблемы внутри культей, то у них и надо качественные бэктрейсы получать.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Для начала достаточно получить хоть какие-то бэктрейсы, а не просто функции на вершине стэка, а для этого достаточно иметь обычный нестрипанный бинарник

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.