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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Медленная прорисовка окон Qt 4.8 [РЕШЕНО]  (Прочитано 13135 раз)
UndeadDragon
Гость
« : Октябрь 05, 2012, 18:02 »

Всем привет. Я еще мало работал с GUI, поэтому сейчас, когда пишу более-менее объемную программу, возникает море вопросов. Мне не раз тут уже помогали, на этом форуме, поэтому заранее всем огромное спасибо и лучи добра.

К сути:
К примеру, возьмем окно сохранения одного из 4 графиков в модуле графиков.

Оно содержит просто 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 мб в оперативной памяти.
« Последнее редактирование: Октябрь 07, 2012, 16:09 от UndeadDragon » Записан
Bepec
Гость
« Ответ #1 : Октябрь 05, 2012, 18:08 »

Сначала призовём телепатов и узнаем код вашего маааленького окна. Потом призовём экстрасенсов и узнаем, чем забивается у вас основное окно программы. Далее призовём шаманов и узнаем от них конфигурацию вашего компьютера.

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

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 05, 2012, 18:21 »

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

Как вообще лучше делать, создавать объекты или держать их в памяти? Что можно сделать чтобы ускорить прорисовку? Нормально ли это в общем и целом для Qt, такая скорость работы?
Нет, где-то тормоз. Наиболее вероятно - медленно грузится иконка, возможно грузятся dll для плагинов загрузки. Это можно наблюдать в консоли или попробовать загрузить имедж до показа окна. Вообще причин может быть много. Лучше зациклить show/hide и засечь среднее время
Записан
UndeadDragon
Гость
« Ответ #3 : Октябрь 05, 2012, 18:24 »

Сначала призовём телепатов и узнаем код вашего маааленького окна. Потом призовём экстрасенсов и узнаем, чем забивается у вас основное окно программы. Далее призовём шаманов и узнаем от них конфигурацию вашего компьютера.

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

По поводу сжираемой памяти - память  выделяется программе. (30 мб) Когда программе память уже не нужна, она её освобождает, но НЕ отдаёт системе. Вот когда системе понадобится память, она сама возьмёт вашей программы освобождённую память.
Я извиняюсь, конечно, за недосказанность, но мне показалось это очевидным - код окна был сгенерирован из Qt Designer, ровно в том виде, в каком оно на скрине, то есть ничего больше там нет.
Компилируемый пример - вам 1254 строки модуля скинуть? Могу дать в личку, как и экзешник, если сможете помочь разобраться.
Записан
Bepec
Гость
« Ответ #4 : Октябрь 05, 2012, 18:32 »

Igors Непонимающий

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

PS если это бред - то киньте пожалуйста ссылочку об освобождении занятой памяти в винде.
Записан
UndeadDragon
Гость
« Ответ #5 : Октябрь 05, 2012, 18:36 »

Igors Непонимающий

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

PS если это бред - то киньте пожалуйста ссылочку об освобождении занятой памяти в винде.
Ну, эм, в диспетчере задач хорошо видно, что освобождаемая память сразу возвращается системе..
Записан
_OLEGator_
Гость
« Ответ #6 : Октябрь 05, 2012, 19:00 »

На этом форуме никто не будет копаться в 1254 строчках кода - выкладывайте минимально компилируемый проект с ошибкой (возможно на стадии его формирования вы сами же обнаружите у себя ошибку).
В Qt окна вполне себе быстро отображаются и создаются - ищите в первую очередь проблему в своей криворукости.
Записан
Bepec
Гость
« Ответ #7 : Октябрь 05, 2012, 19:23 »

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

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

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Октябрь 05, 2012, 19:29 »

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

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

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

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

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

- ищите в первую очередь проблему в своей криворукости.
Ну обвинять в криворукости оснований нет, но не горит желанием тестировать - это точно  Улыбающийся
Записан
Bepec
Гость
« Ответ #9 : Октябрь 05, 2012, 19:41 »

Найти б инструкцию как его писать и зачем, да получить мотивацию Веселый
Записан
UndeadDragon
Гость
« Ответ #10 : Октябрь 05, 2012, 19:42 »


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

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

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

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

Да я и не обвиняю, я говорю о том, что с ходу обвинять Qt не стоит - в первую очередь следует проверить на прямоту свои руки и правильность использования инструментария.
Записан
UndeadDragon
Гость
« Ответ #12 : Октябрь 05, 2012, 19:52 »

Да я и не обвиняю, я говорю о том, что с ходу обвинять Qt не стоит - в первую очередь следует проверить на прямоту свои руки и правильность использования инструментария.
Да что вы, окститесь, я Qt не обвинил, это шутка была Улыбающийся Честно слово, в программировании я всегда подвергаю сомнению сначала свой код, а уж потом чужой.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #13 : Октябрь 05, 2012, 19:56 »

Вот .exe файл на Google диске.

Попросили же - минимально компилируемый проект, зачем экзешники? У всех компы разные.
Записан
UndeadDragon
Гость
« Ответ #14 : Октябрь 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.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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