Russian Qt Forum

Qt => Вопросы новичков => Тема начата: UndeadDragon от Октябрь 05, 2012, 18:02



Название: Медленная прорисовка окон Qt 4.8 [РЕШЕНО]
Отправлено: UndeadDragon от Октябрь 05, 2012, 18:02
Всем привет. Я еще мало работал с GUI, поэтому сейчас, когда пишу более-менее объемную программу, возникает море вопросов. Мне не раз тут уже помогали, на этом форуме, поэтому заранее всем огромное спасибо и лучи добра.

К сути:
К примеру, возьмем окно сохранения одного из 4 графиков в модуле графиков.
(http://i39.fastpic.ru/big/2012/1005/97/78375afce780b0f846e3bd86c9c0ae97.png)
Оно содержит просто 4 radioButton и маленькую иконку для симпатичности.
Конструктор и вызов совершенно обычные:
Код:
//Конструктор
saveWindow::saveWindow(QWidget *parent):QDialog(parent){
//Окно сохранения
setupUi(this);

connect(okButton,SIGNAL(clicked()),this,SLOT(okBut()));
connect(okButton,SIGNAL(clicked()),this,SLOT(close()));
connect(cancelButton,SIGNAL(clicked()),this,SLOT(close()));

this->setWindowIcon(QIcon(":/icons/save.png"));
this->setWindowTitle("Сохранить выбранный график");

refresh();//Меняет имена на нужные, небольшая функция, не имеет смысла приводить ее.

}
//--------------------------------------//
//Вызов
void quadraPlotter::saveScreenshot(){
//Отображение окна сохранения в модальном режиме
saver->refresh();
saver->exec();
}
Названия своих кнопок берет из настроек, но скорость зависит явно не от этого (экспериментировал).
Несмотря на мелкий размер и небольшое содержимое, грузится сие творение примерно полсекунды-секунду. Что, конечно, совсем не долго, но напрягает, что сначала появляется рамка Windows, а потом уже все остальное. Причем так, что заметить это глазом вполне возможно.
В связи с этим вопрос: Как вообще организовываются такие вещи в GUI?

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

Как вообще лучше делать, создавать объекты или держать их в памяти? Что можно сделать чтобы ускорить прорисовку? Нормально ли это в общем и целом для Qt, такая скорость работы? Может быть можно хотя бы убрать это мелькание с рамкой? (то, что содержимое не сразу прорисовывается). Я читал, что Qt пошустрее дотнета, но выходит как-то наоборот пока.
Знаю про метод двойной буферизации, но не уверен в том, что тут он поможет и еще им не пользвался.

P.S. Заодно подскажите еще вот что: после сохранения скриншота графика, вызванное окно проводника
Код:
QString file = QFileDialog::getSaveFileName(this,"Сохранить график",".","PNG (*.png)");
Остается в памяти. Причем выжирает 10 мб и назад не выгружается. Что можно сделать? Мне уже, честно говоря, стремно за программу, если один модуль графиков пожирает до 30 мб в оперативной памяти.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Bepec от Октябрь 05, 2012, 18:08
Сначала призовём телепатов и узнаем код вашего маааленького окна. Потом призовём экстрасенсов и узнаем, чем забивается у вас основное окно программы. Далее призовём шаманов и узнаем от них конфигурацию вашего компьютера.

 А потом мб вы выложите минимально компилируемый пример?

По поводу сжираемой памяти - память  выделяется программе. (30 мб) Когда программе память уже не нужна, она её освобождает, но НЕ отдаёт системе. Вот когда системе понадобится память, она сама возьмёт вашей программы освобождённую память.

Проще выражаясь:
Код:
запуск = 2мб (занято 2, свободно 0)
вызов файлового окна = 30мь (занято 30, свободно 0)
удаление файлового окна (закрытие) = 30 мб(занято 2, свободно 28)


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Igors от Октябрь 05, 2012, 18:21
По поводу сжираемой памяти - память  выделяется программе. (30 мб) Когда программе память уже не нужна, она её освобождает, но НЕ отдаёт системе. Вот когда системе понадобится память, она сама возьмёт вашей программы освобождённую память.
Сказки про белого бычка  :)

Как вообще лучше делать, создавать объекты или держать их в памяти? Что можно сделать чтобы ускорить прорисовку? Нормально ли это в общем и целом для Qt, такая скорость работы?
Нет, где-то тормоз. Наиболее вероятно - медленно грузится иконка, возможно грузятся dll для плагинов загрузки. Это можно наблюдать в консоли или попробовать загрузить имедж до показа окна. Вообще причин может быть много. Лучше зациклить show/hide и засечь среднее время


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: UndeadDragon от Октябрь 05, 2012, 18:24
Сначала призовём телепатов и узнаем код вашего маааленького окна. Потом призовём экстрасенсов и узнаем, чем забивается у вас основное окно программы. Далее призовём шаманов и узнаем от них конфигурацию вашего компьютера.

 А потом мб вы выложите минимально компилируемый пример?

По поводу сжираемой памяти - память  выделяется программе. (30 мб) Когда программе память уже не нужна, она её освобождает, но НЕ отдаёт системе. Вот когда системе понадобится память, она сама возьмёт вашей программы освобождённую память.
Я извиняюсь, конечно, за недосказанность, но мне показалось это очевидным - код окна был сгенерирован из Qt Designer, ровно в том виде, в каком оно на скрине, то есть ничего больше там нет.
Компилируемый пример - вам 1254 строки модуля скинуть? Могу дать в личку, как и экзешник, если сможете помочь разобраться.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Bepec от Октябрь 05, 2012, 18:32
Igors ???

Со слов крупного специалиста в программировании, это есмь система потребления памяти в винде. А его словам я не могу не доверять, ибо он считай мой сенсей :)

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


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: UndeadDragon от Октябрь 05, 2012, 18:36
Igors ???

Со слов крупного специалиста в программировании, это есмь система потребления памяти в винде. А его словам я не могу не доверять, ибо он считай мой сенсей :)

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


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: _OLEGator_ от Октябрь 05, 2012, 19:00
На этом форуме никто не будет копаться в 1254 строчках кода - выкладывайте минимально компилируемый проект с ошибкой (возможно на стадии его формирования вы сами же обнаружите у себя ошибку).
В Qt окна вполне себе быстро отображаются и создаются - ищите в первую очередь проблему в своей криворукости.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Bepec от Октябрь 05, 2012, 19:23
Попробуй посоздавать объекты и поудалять.

Тысяч 9-12 где то.

У твоей программы останется часть памяти зарезервированный виндосовским менеджером памяти.

Есть дофига типов памяти :) А вот резервируемая и есть та, что ты создаёшь объект и удаляешь его. Если вдруг тебе захочется создать его ещё раз (ну вот захотелось) то память выделять не придётся - она уже будет у программы и это + к быстродействию :)


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Igors от Октябрь 05, 2012, 19:29
Со слов крупного специалиста в программировании, это есмь система потребления памяти в винде. А его словам я не могу не доверять, ибо он считай мой сенсей :)

PS если это бред - то киньте пожалуйста ссылочку об освобождении занятой памяти в винде.
Неправильно утверждать что память "не отдается" ОС(у), да и сама формулировка неудачна - что значит "отдается" ??? Информация о том что блок освобожден фиксируется ОС, другое дело что активность (выделение страниц, свап на диск и др) как правило будет уже при следующем выделении(ях). Частный случай с realloc мы давеча обсуждали, но то уже др вопрос.

Попробуй посоздавать объекты и поудалять.

Тысяч 9-12 где то.

У твоей программы останется часть памяти зарезервированный виндосовским менеджером памяти.
Все эти иллюзии развеиваются легко - достаточно 1 раз написать свой менеджер памяти  :)

- ищите в первую очередь проблему в своей криворукости.
Ну обвинять в криворукости оснований нет, но не горит желанием тестировать - это точно  :)


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Bepec от Октябрь 05, 2012, 19:41
Найти б инструкцию как его писать и зачем, да получить мотивацию :D


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: UndeadDragon от Октябрь 05, 2012, 19:42

Ну обвинять в криворукости оснований нет, но не горит желанием тестировать - это точно  :)

Ну, я вообще сюда зашел не за оценочным суждением моих скиллов :) Я месяц, как стал пробовать GUI и Qt и очень мало опыта пока имею.
И я туплю потому, положа руку на сердце, не знаю, как мне урезать этот модуль до меньших размеров, чтобы вы могли мне помочь.

Ребят, давайте тогда начнем последовательно.
Вот .exe файл на Google диске. Я убрал оттуда почти все, что можно, в т.ч. графику. Вы посмотрите, и скажите мне: реально медленно или я фигней страдаю и все ок?
Функции всякие потыкать можно через ПКМ на полотне и в меню "Файл".
https://docs.google.com/open?id=0B60JCWlN7fmeOXVHSjZZNUduREU
В архиве пара Qt dll'ок и .exe, можно сразу запустить тыкнув.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: _OLEGator_ от Октябрь 05, 2012, 19:50
Ну обвинять в криворукости оснований нет, но не горит желанием тестировать - это точно  :)

Да я и не обвиняю, я говорю о том, что с ходу обвинять Qt не стоит - в первую очередь следует проверить на прямоту свои руки и правильность использования инструментария.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: UndeadDragon от Октябрь 05, 2012, 19:52
Да я и не обвиняю, я говорю о том, что с ходу обвинять Qt не стоит - в первую очередь следует проверить на прямоту свои руки и правильность использования инструментария.
Да что вы, окститесь, я Qt не обвинил, это шутка была :) Честно слово, в программировании я всегда подвергаю сомнению сначала свой код, а уж потом чужой.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Alex Custov от Октябрь 05, 2012, 19:56
Вот .exe файл на Google диске.

Попросили же - минимально компилируемый проект, зачем экзешники? У всех компы разные.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: UndeadDragon от Октябрь 05, 2012, 20:04
Вот .exe файл на Google диске.

Попросили же - минимально компилируемый проект, зачем экзешники? У всех компы разные.
Вдруг и проблемы нет?
Я не знаю, что я могу выдрать! Там большая часть кода - сгенирированно uic из формочек Qt Designer.
Я могу их убрать и GUI не станет на этом светлом моменте.

Вот файл реализации итогового класса.
https://www.assembla.com/code/kuprashevich/subversion/nodes/PlotterModul/PlotterModul/quadraPlotter.cpp?rev=16
Там же реализуется класс этой формочки, которую я показал в посте для примера. Хотя, на самом деле, все формы в модуле работают с одинаковой скоростью.

Файл реализации графиков, функций сохранения и переименования
https://www.assembla.com/code/kuprashevich/subversion/nodes/PlotterModul/PlotterModul/plotswindow.cpp?rev=16

Файл с классом-окошечком настроек
https://www.assembla.com/code/kuprashevich/subversion/nodes/PlotterModul/PlotterModul/plotsettings.cpp?rev=16

Все остальное - header-файлы и код сгенерированный uic.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Bepec от Октябрь 05, 2012, 20:20
Почему люди не понимают русского? :)

Минимально КОМПИЛИРУЕМЫЙ проект. Т.е. файлы твоих классов, файл проекта, всё в архиве, чтобы любой человек мог его скачать, распаковать и СКОМПИЛИРОВАТЬ млиааа. А не ссылки на текст программы без ашников.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: UndeadDragon от Октябрь 05, 2012, 20:52
Почему люди не понимают русского? :)

Минимально КОМПИЛИРУЕМЫЙ проект. Т.е. файлы твоих классов, файл проекта, всё в архиве, чтобы любой человек мог его скачать, распаковать и СКОМПИЛИРОВАТЬ млиааа. А не ссылки на текст программы без ашников.
Ок, но я не уверен в наличии у вас Qwt, который участвует.
Попробовал кинуть в папку с проектом сорсник Qwt и указал в хедерах нужный путь, должно работать.
https://docs.google.com/open?id=0B60JCWlN7fmeN0ZuWG5zeHMwdjQ - почти полный проект, с рабочими функциями
https://docs.google.com/open?id=0B60JCWlN7fmeZ3Z1cmhfTHh4ekU  - обрезал что мог оставил только вызов окон, функции почти все убрал. Низкую скорость можно заметить по "сохранить" и "настройки".

P.S. Нет, наверное без Qwt на машине хрен что соберется
https://docs.google.com/open?id=0B60JCWlN7fmeWTVqVDFrOGJjSDg


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Serr500 от Октябрь 05, 2012, 21:17
Вот .exe файл на Google диске.

Не заводится. И dll-ки не скачать (404 Not Found) и одной dll-ки нету.



Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: UndeadDragon от Октябрь 05, 2012, 21:28
Вот .exe файл на Google диске.

Не заводится. И dll-ки не скачать (404 Not Found) и одной dll-ки нету.


Вы с оперы, быть может? Гугл Диск с ней чудит.
Так должно
http://narod.ru/disk/62071747001.9ca1bb318bff19d8da11a3c4137ea172/OS.rar.html


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Serr500 от Октябрь 05, 2012, 21:31
Firefox. Щас посмотрю на народе.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Serr500 от Октябрь 05, 2012, 21:45
1. Браузер ни при чём. В IE9, Firefox 15, Chrome 22 и Opera 12 одно и то же - нет qwtd.dll, а остальные выдают 404.

2. Покрутил я Вашу программку. Просто летает. Тормозов никаких нет. Система: Win7 x64, Phenom II X6 1100T @ 3.3GHz, 12Gb RAM.

4.
P.S. Заодно подскажите еще вот что: после сохранения скриншота графика, вызванное окно проводника
Код:
QString file = QFileDialog::getSaveFileName(this,"Сохранить график",".","PNG (*.png)");
Остается в памяти. Причем выжирает 10 мб и назад не выгружается. Что можно сделать? Мне уже, честно говоря, стремно за программу, если один модуль графиков пожирает до 30 мб в оперативной памяти.
4-1. По нынешним временам 30Mb - не память!
4-2. Это так и задумано. На инициализацию объектов COM требуется много времени, поэтому компонент инициализируется только один раз при первом вызове и его структуры данных остаются в памяти процесса до его завершения. А IFileSaveDialog, который вызывается в QFileDialog::getSaveFileName, является COM-объектом.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: UndeadDragon от Октябрь 05, 2012, 21:58
1. Браузер ни при чём. В IE9, Firefox 15, Chrome 22 и Opera 12 одно и то же - нет qwtd.dll, а остальные выдают 404.

2. Покрутил я Вашу программку. Просто летает. Тормозов никаких нет. Система: Win7 x64, Phenom II X6 1100T @ 3.3GHz, 12Gb RAM.

4-1. По нынешним временам 30Mb - не память!
4-2. Это так и задумано. На инициализацию объектов COM требуется много времени, поэтому компонент инициализируется только один раз при первом вызове и его структуры данных остаются в памяти процесса до его завершения. А IFileSaveDialog, который вызывается в QFileDialog::getSaveFileName, является COM-объектом.
1. Последний .dll я действительно пропустил, на Яндекс уже с ним залил, но уже не важно :)
2. С такими мощностями... Я даже не знаю, на таком компе наверное ничто не тормозит) У вас окна быстро прорисовываются там, есть эффект, что сначала появляется рамка, а потом остальное?

Последние два пункта согласен, 30 мб не очень много, просто думал может я что не так сделал. Главное - время процессора, конечно :)


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Serr500 от Октябрь 06, 2012, 10:12
2. С такими мощностями... Я даже не знаю, на таком компе наверное ничто не тормозит) У вас окна быстро прорисовываются там, есть эффект, что сначала появляется рамка, а потом остальное?
Ну, при интенсивных дисковых операциях тормозит... Хотел было взять SSD, но остановила высокая цена и низкая надёжность. Бывают тормоза при одновременной работе пяти виртуальных машин. (Машинку специально собирал для виртуализации - часто требуется работать с различными ОС, а ставить всё на "живую" и постоянно перезагружаться не хочется.)

Окна прорисовываются быстро. Указанного эффекта нет. Окно появляется с характерным для Win7 эффектом "проявления" уже с графиками. Но один не очень красивый эффект заметил. Первое открытие окон "Сохранить" и "Настройки" идеальное, а при последующих оно "мерцает" один раз, т.е. перерисовывается уже после отображения. Вероятно, какой-то код заставляет его выполнить repaint после show. Если сделать наоборот, будет, наверное, правильнее.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Bepec от Октябрь 06, 2012, 10:53
оффтоп: SSD надежны. У меня уже года два-три стоит - не нарадуюсь. Общий срок службы ещё 8 лет, как говорит его утилитка :)



Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Serr500 от Октябрь 06, 2012, 11:23
Оффтоп:
Поздравляю. Я перед покупкой компьютера прикинул интенсивность использования и у меня получилось, что он начнёт дохнуть через пару лет. Отдавать за это больше 15 тысяч не захотелось. Подожду немного, пока возрастёт число циклов перезаписи ячеек, объёмы и упадут цены.  ;)


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: _OLEGator_ от Октябрь 06, 2012, 11:44
Никого не смущает debug-версия сборки?


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: UndeadDragon от Октябрь 06, 2012, 20:16
Никого не смущает debug-версия сборки?

Меня уже смутила вчера, забыл отписаться :)
Я просто не знал, что настолько большая разница в скоростях, теперь разобрался в этом, буду знать. Спасибо всем за помошь.

P.S. Если кому из новичков понадобится, то собрать при помощи VS в релиз можно поменяв в .pro файле
Код:
TEMPLATE = vcapp
CONFIG += release
, выполнив для него qmake, и выставив, соответственно, release на панели "Standart" в VS. Иначе не катило :)
Просто дико злит, когда человек на форуме задает вопрос, в итоге разбирается в чем было дело, но другим, кто идет по его стопам, ответ не сообщает.

Еще раз всем спасибо.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Bepec от Октябрь 06, 2012, 20:35
Эммм? в VS отсутствие или изменение pro файла на сборку проекта не влияет как бе :)

PS VS - Visual Studio. И конечно же при установленном Addin'e.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: UndeadDragon от Октябрь 06, 2012, 22:39
Эммм? в VS отсутствие или изменение pro файла на сборку проекта не влияет как бе :)

PS VS - Visual Studio. И конечно же при установленном Addin'e.
Не совсем. Если задать параметры сборки в .pro файле и установить режим vcapp (ну, Visual C++ Application, сие значит, я подозреваю), а потом выполнить qmake, то сгенерируется файл .vcxproj, который, естественно, уже напрямую задает параметры сборки в VS :) Таким образом можно управлять сборкой и через .pro. Если бы не это, я бы не знаю как собирал Qwt под VS :)
Да, Visual Studio. Да, с ним.


Название: Re: Медленная прорисовка окон Qt 4.8
Отправлено: Bepec от Октябрь 07, 2012, 09:54
Понятно, буду знать :) В заголовок темы добавь [РЕШЕНО] пожалуйста :)

PS это надо отредактировать первое сообщение и изменить поле "Тема".