![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как уменьшить количество ОЗУ занимаемой программой [D6, Win2k, WinXP]
Дубинин Алексей © (2004-04-07 23:09:00)Программа во время работы может занимать оперативной памяти от 4 до 10 Мб. Это много, для чаще всего работающей в фоне программы. Подскажите как можно время от времени уменьшать ее.
Заранее спасибо.
Users (2004-04-19 15:47:00) [1]2 Zot
Большое спасибо! Проверил код работает, нужно только учесть что функция не работает на Windows 9X.
Замерял на своей программе, написана на API:
До 2977 кб, после использования функции 2232 кб = 745 кб выигрыш. Не плохо!
KSergey (2004-04-18 11:59:00) [2]Вероятно, еще пользователей удасться убедить сравнением смет разработки ПО с данной функциональностью на Delphi на какой-либо другой среде (возможно на дельфи, но без использования VCL)
Дубинин Алексей (2004-04-12 22:16:00) [3]Всем спасибо...действительно моя душа успокоилась. На самом деле так и думал...читал об этом. Короче на все подобные вопросы так и буду отвечать как сказал Игорь Шевченко.
Владислав (2004-04-12 07:08:00) [4]> Игорь Шевченко © (10.04.04 21:23) [27]
Я то это понимаю, но им это вряд ли объяснишь.
> Anatoly Podgoretsky © (11.04.04 12:44) [28]
Ага. Это мои проблемы :)
Anatoly Podgoretsky (2004-04-11 12:44:00) [5]Резюме:
Так что пусть пользователи не беспокоятся, это не их проблема.
Игорь Шевченко (2004-04-10 21:23:00) [6]
> Смех смехом, но... наши пользователи (не все, конечно) не
> раз задавали вопросы типа "почему ваша программа занимает
> столько памяти?".
Потому что использует много обращений к DLL, например, к OLE-библиотекам, которые могут и не использоваться.
Task Manager показывает как память, занимаемую программой, так и память, занимаемую библиотеками. При этом память, занимаемая библиотеками учитывается для каждого процесса, хотя на самом деле в памяти они присуствуют в единственном экземпляре. Так что пусть пользователи не беспокоятся, это не их проблема.
Владислав (2004-04-10 11:21:00) [7]> Zot (10.04.04 10:54) [25]
Согласен, тоже нефигово.
Zot (2004-04-10 10:54:00) [8]ну по крайней мере пользователи других ОС будут довольны что прога будет обычно жрать порядка 300К-2000К
Владислав (2004-04-10 10:50:00) [9]> Zot (10.04.04 10:45) [23]
Потому и печаль... часть пользователей сидят на 95. Хотя... это не моя печаль... это их проблемы...
Zot (2004-04-10 10:45:00) [10]SetProcessWorkingSetSize работает в 98 и Ме кроме 95
так что с 95 не повезло
Владислав (2004-04-10 10:38:00) [11]> Zot (10.04.04 10:35) [21]
Это не работает в 95, 98 и ME. Как быть с этими ОСями?
Zot (2004-04-10 10:35:00) [12]Все очень просто когда программа переходит в фоновый режим винда вызывает функцию
SetProcessWorkingSetSize( //our process PID
OpenProcess(PROCESS_SET_QUOTA,false,xxxProcessPID),
$ffffffff,
$ffffffff
);
после чего измененная память процесса сбрасывается сбрасывается в своп а неизмененная ,дополнительные загруженные библиотеки и сам исполняемый файл, просто освобождается так как все эти данные можна загруззить в любой момент с диска.
все это можна сделать и самому просто вызвав эту функцию
Владислав (2004-04-10 10:29:00) [13]Смех смехом, но... наши пользователи (не все, конечно) не раз задавали вопросы типа "почему ваша программа занимает столько памяти?". Прога написана на Delphi 6. В памяти (в Task Manager) занимает 6 - 8 мегабайт.
Иные программы в том же Task Manager отображаются с гораздо меньшим потреблением памяти. И как им это удается?.. Может кто в курсе? Я боролся с этим минимизируя главное окно. Может есть более интерессные решения?
Sirgfine (2004-04-09 23:21:00) [14]Существует только один способ узнать сколько именно кушает программу: взять какой-нибудь редактор,просомтрщик, менеджер памяти (На худой конец и оптимизатор типа FreeMem). Он покажет сколько кушает программа, а сколько библиотеки, или хотя-бы даст тебе возможность посчитать это самому (сложи суммы длин блоков).
Anatoly Podgoretsky (2004-04-09 22:48:00) [15]Слово выгружен жаэе не совсем применимо, для исполнимого кода например, как бы в ехе так там и останется. А память ну не жрут ее программы, это операционка иногда самовольно туда загружает страницы. И зачем она только это делает, если спустя некоторое время забывает про них.
Biryk (2004-04-09 21:24:00) [16]Ti poprobuy napisat servis (demona)kotoriy vobshe ne imeit okon (vse biblioteki kotorie dlya roboti s oknami krome Windows otkluchi...). Potom spomoshu WinApi sozdayosh okno (bez knopok i podobnoy herni...), v kotoroe ustanavluesh obrabotchi svoey komandi. Daniy demon vipolnyaet te operacii sho tebe nado. ++ Pishes programu kotoruy budet zagruzhat tvoy demon. Programa dolznha prosto mogti rabotat cherez komandi s demonom (sendMessage ...). ==> Programa mozhet ispolzovat vse navoroti, i posli vnesenie neobhotimih nastoek dlya demona vigruzhaetca.
I esho Demona zdelay Consolnim...
ламер (2004-04-09 16:11:00) [17]> _Sh_ (09.04.04 02:37) [14]
никто. т.к. твой EXE-шник в любой момент времени может полностью или частично быть выгружен из ОЗУ. хотя бы в своп-файл.
sniknik (2004-04-09 08:22:00) [18]никогда не интересовался, но счас (после описания [11]) проверил несколько своих программ, они все обладают этим свойством хотя специально ничего для этого не делал...
(сворачивание уменьшеет показываемый размер памяти в таскменеджере)
отчего это хз. но в принципе можно сравнить и выяснить, пока единственное отличие вижу - у меня D7.
_Sh_ (2004-04-09 02:37:00) [19]А кто тогда может сказать, сколько RAM жрёт именно мой EXE-шник?
Sirgfine (2004-04-09 00:31:00) [20]TaskMeneger показывает не память, занимаемую программой, а память занимаемую программой + всеми библиотеками, которые она использует.
Так-что скорее всего твоя программка не так уж и много кушает, а библиотеки динамические и следовательно загружены один раз для всей системы.
Чтобы решить эту проблему (если она так важна) попробуй неиспользовать какие-нибудь внешние функции (если это возможно) или просто скажи пользователю, чтобы он NT(2k,XP) поставил и памяти прибавил.