Russian Qt Forum

Qt => Общие вопросы => Тема начата: pakulo от Апрель 08, 2007, 13:07



Название: QT и память
Отправлено: pakulo от Апрель 08, 2007, 13:07
Добрый день,

У меня такой вопрос. Создал простенькую программку на QT, просто кнопка. И она у меня в памяти занимает 12мб. Посмотрев многие примеры, оказалось что минимальный размер программы с библиотекой QT будет 10мб где-то.
Возможно ли как-то уменьшить этот показатель?
Если у меня программка будет сидеть в трее, можно ли сделать, что бы она занимала не 10мб, а скажем 1мб...

Спасибо


Название: QT и память
Отправлено: noosooth от Апрель 08, 2007, 16:15
Боюсь радикально тут ничего не сделать.
Жрет память, зараза :), что для библиотеки такого класса и при нынешних объемах памяти - вполне нормально.
Боюсь для Вас это будет слабым утешением, но при увеличении Вашего собственного кода (не одна кнопка, а скажем двадцать одна)
размер потребляемой памяти растет не так радикально.

Ещё такой нюанс (если Вы под виндой):
Скажем моё поделие (Qt 4.2.3) под XP и XP64, если верить Task Manager,занимает в памяти 10-11 метров.
Если приложение свернуть (минимизировать), то Task Manager показывает всего-лишь 1,5 метра.

Тут пробовал запускать под Vista x64 - тамошний Task Manager или как
его там зовут - кажет стабильно 8 c лишним мегабайт, в том числе и для
"свернутого" приложения.

Спрашивается кому верить?
(бинарник один и тот же, Qt собран статически)


Название: QT и память
Отправлено: pakulo от Апрель 08, 2007, 16:20
>>Если приложение свернуть (минимизировать), то Task Manager показывает всего-лишь 1,5 метра.

Да, я видел это. Мне вот интересно. Это реализовано библиотекой или ОС сама это делает. Т.е. может при минимизации она сама уменьшает память, копируя данные на диск.. :)

Тогда такой вопрос. У меня программа занимает 20Мб, я поработал, свернул ее в трей, как мне сделать что бы уменьшилась память? т.е. также как при минимизации...


Название: QT и память
Отправлено: _govorilka от Апрель 08, 2007, 16:40
Цитата: "pakulo"
Добрый день,

У меня такой вопрос. Создал простенькую программку на QT, просто кнопка. И она у меня в памяти занимает 12мб. Посмотрев многие примеры, оказалось что минимальный размер программы с библиотекой QT будет 10мб где-то.
Возможно ли как-то уменьшить этот показатель?
Если у меня программка будет сидеть в трее, можно ли сделать, что бы она занимала не 10мб, а скажем 1мб...

Спасибо


Раздели свою программу на две половинки (сделай два exe-файла):
1. То, что постоянно весит в трее
2. То, что запускается в отдельном процессе, после каких-либо действий пользователя (щелчок мыши по иконке, расписание или системное событие).
В первом куске, не используй никаких Gui-примочек (исключение cоставляет разве, что иконка в трее), тогда объем памяти будет гораздо меньше.

добавлено спустя 17 минут:

 
Цитата: "noosooth"

Ещё такой нюанс (если Вы под виндой):
Скажем моё поделие (Qt 4.2.3) под XP и XP64, если верить Task Manager,занимает в памяти 10-11 метров.
Если приложение свернуть (минимизировать), то Task Manager показывает всего-лишь 1,5 метра.


Это глюк Task Manager'а. Вместо него пользуюсь бесплатной Process Explorer (скачать можно отсюда - http://www.microsoft.com/technet/sysinternals/ProcessesAndThreads/ProcessExplorer.mspx).


Название: QT и память
Отправлено: pakulo от Апрель 08, 2007, 16:58
Не, разделять на две программы не можно.
Может просто есть какая-нить функция чистки памяти? :)


Название: QT и память
Отправлено: _govorilka от Апрель 08, 2007, 17:18
Цитата: "pakulo"
Не, разделять на две программы не можно.
Может просто есть какая-нить функция чистки памяти? :)


Цитата: "pakulo"
Не, разделять на две программы не можно.
Может просто есть какая-нить функция чистки памяти? :)


Разделение на две программы - это не способ чистки памяти, это способ оптимизации программы. Зачем постоянно держать в трее Gui-поток?


Название: QT и память
Отправлено: pakulo от Апрель 08, 2007, 17:56
Проблема в том, что у меня программа клиент, скажем до сервера АСИ.
Поэтому возможности разделить на две программы нету. ((


Название: QT и память
Отправлено: _govorilka от Апрель 08, 2007, 18:19
Цитата: "pakulo"
Проблема в том, что у меня программа клиент, скажем до сервера АСИ.
Поэтому возможности разделить на две программы нету. ((


Найди в форме тему о размере exe, мне кажется, там есть ответы интересные для тебя.

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


Название: QT и память
Отправлено: noosooth от Апрель 08, 2007, 18:22
Цитата: "_govorilka"

 
Цитата: "noosooth"

...Если приложение свернуть (минимизировать), то Task Manager показывает всего-лишь 1,5 метра.

Это глюк Task Manager'а. Вместо него пользуюсь бесплатной Process Explorer ...


Не вижу никакой разницы между показаниями
Task Manager'а (Mem Usage) и Process Explorer'а (Working set) под XP64 SP2. Абсолютно одно и тоже.
Где глюк-то?

Насчет Vista, виноват, не туда смотрел.
Тоже уменьшает размер при свертывании, но не так радикально.


Название: QT и память
Отправлено: _govorilka от Апрель 08, 2007, 18:28
У меня Windows XP Pro SP2, а Process Explorer, как мне кажется, просто удобнее стандартного Task Manager'a


Название: QT и память
Отправлено: noosooth от Апрель 08, 2007, 18:50
Цитата: "_govorilka"
У меня Windows XP Pro SP2, а Process Explorer, как мне кажется, просто удобнее стандартного Task Manager'a

И такая операционка где-то тут у меня валяется и тоже показания одинаковые.
Про глюк Вы пошутили или к слову пришлось?


Название: QT и память
Отправлено: _govorilka от Апрель 08, 2007, 19:12
Цитата: "noosooth"

И такая операционка где-то тут у меня валяется и тоже показания одинаковые.
Про глюк Вы пошутили или к слову пришлось?


Можно вопрос, чем так быстро оси меняете?


Название: QT и память
Отправлено: noosooth от Апрель 08, 2007, 20:07
Да просто несколько осей на разных винтах да разделах + Grub.
Перезагрузится недолго вроде ;).

Наверное что-нить вроде VMware в данном случае удобнее, но я так сказать напрямую желаю без "посредников".
Честно говоря, достал этот зоопарк из "многообразных" операционных систем от M$.


Название: QT и память
Отправлено: Alex03 от Апрель 09, 2007, 09:04
Вроде как XP буферизирует (частично) видео вывод, вот выделяет память под окна.


Название: QT и память
Отправлено: Mr. Пронька от Апрель 09, 2007, 09:39
Цитировать
Вроде как XP буферизирует (частично) видео вывод, вот выделяет память под окна.

Всякое возможно. А с другими приложениями вы этот трюк наблюдали? Я уже когда-то поднимал тему про выделение памяти в Qt-приложениях, но никто ничего толком ответить не смог. Дело не только в том, что при сворачивании количество потребляемой памяти снижается. При разворачивании окна на весь экран оно ещё и увеличивается!


Название: QT и память
Отправлено: noosooth от Апрель 09, 2007, 10:06
Господа, про уменьшение "Mem Usage" (Working Set) под виндой при
минимизации top-level окна читайте  вот здесь (http://support.microsoft.com/default.aspx?scid=kb;en-us;Q293215).

Ну и про функцию SetProcessWorkingSetSize() в MSDN.


Название: QT и память
Отправлено: pakulo от Апрель 09, 2007, 16:27
Mr. Пронька,
Вот именно, поэтому я и спросил. Мне кажеться что это все работа ХР. Такое наблюдал я и с Оперой, занимает 80мб, свернул уже 20Мб (Она тоже на QT). Вот Лиса никак не уменьшает память при сворачивание. Поэтому меня и интересует, это дело библиотеки или ОС. Свернул Ворд, занимал 20Мб, стало 1Мб. Свернул Експлорер было 15Мб, стало 1.5Мб. Все как-то странно.
И почему когда я сворачиваю в трей программу на КуТе, то память не уменьшается? :)

добавлено спустя 5 часов 58 минут:

 У кого есть utorrent или MSN, то можно увидеть, что при сворачивании программы в трей, размер занимаемый программой в памяти уменьшается.
Как это реализовано?


Название: QT и память
Отправлено: _govorilka от Апрель 09, 2007, 16:39
Цитата: "Mr. Пронька"
Цитировать
Вроде как XP буферизирует (частично) видео вывод, вот выделяет память под окна.

Всякое возможно. А с другими приложениями вы этот трюк наблюдали? Я уже когда-то поднимал тему про выделение памяти в Qt-приложениях, но никто ничего толком ответить не смог. Дело не только в том, что при сворачивании количество потребляемой памяти снижается. При разворачивании окна на весь экран оно ещё и увеличивается!


Вывод буферизирует не XP, а Qt, причем использует для этого QPixmap. Чем больше размер вашего окна, тем требуется для хранения буфера. При сворачивании буфер уничтожается, поэтому программа потребляет меньше памяти.


Название: QT и память
Отправлено: pakulo от Апрель 09, 2007, 17:29
Как можно реализовать очистку буфера когда программа сворачивается в трей?


Название: QT и память
Отправлено: _govorilka от Апрель 09, 2007, 17:33
Цитата: "pakulo"
Как можно реализовать очистку буфера когда программа сворачивается в трей?


Qt сама очищает буфер, при сворачивание окна, а вот операционка  (WinXP) очищает неиспользуемую память через раз.

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


Название: QT и память
Отправлено: pakulo от Апрель 09, 2007, 17:40
Проблем много. Решаю все параллельно :)
Эта проблема очень волнует, так как программа в памяти может занимать до 20Мб и когда свернул ее в трей, всеравно 20Мб, а хотелось бы по меньше.

QT не очищает буфер при сворачивании в трей, очищает при минимизации.


Название: QT и память
Отправлено: _govorilka от Апрель 09, 2007, 18:05
Цитата: "pakulo"
Проблем много. Решаю все параллельно :)
Эта проблема очень волнует, так как программа в памяти может занимать до 20Мб и когда свернул ее в трей, всеравно 20Мб, а хотелось бы по меньше.

QT не очищает буфер при сворачивании в трей, очищает при минимизации.


Можно вопрос, какой компилятор используешь? С какими настройками?


Название: QT и память
Отправлено: pakulo от Апрель 09, 2007, 18:15
Использую mingw32.
Какие настройки нужны?


Название: QT и память
Отправлено: _govorilka от Апрель 09, 2007, 18:23
Цитата: "pakulo"
Использую mingw32.
Какие настройки нужны?


Мне кажется, что VS все-таки лучше, чем mingw32 (после этого сообщения все опять начнут Holy War), программы занимают меньше памяти и код выполняется быстрее. Установи и сравни, в любой случае всегда потом сможешь удалить. Почитай тему про компиляторы, там есть полезные ответы.

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


Название: QT и память
Отправлено: pakulo от Апрель 09, 2007, 19:02
Спасибо буду смотреть.