Когато пишете дългогодишни приложения - вида програми, които ще прекарат по-голямата част от деня, сведени до минимум до лентата на задачите или системна област, може да стане важно да не оставите програмата да „избяга“ с използване на паметта.
Двете най-десни колони показват използването на процесора (времето) и използването на паметта. Ако даден процес се отрази силно върху някое от тези, вашата система ще се забави.
Видът, който често се отразява на използването на процесора, е програма, която се цикли (помолете всеки програмист, който е забравил да постави операция „прочетете следващия“ в цикъл за обработка на файлове). Тези видове проблеми обикновено се коригират лесно.
Използването на паметта, от друга страна, не винаги е очевидно и трябва да се управлява повече от коригирано. Да предположим например, че се изпълнява програма за тип заснемане.
Тази програма се използва през целия ден, вероятно за телефонно заснемане на бюро за помощ или по някаква друга причина. Просто няма смисъл да го изключвате на всеки двадесет минути и след това да го стартирате отново. Ще се използва през целия ден, макар и на редки интервали.
Ако тази програма разчита на някаква тежка вътрешна обработка или има много произведения на изкуството във формите си, рано или късно нейните използване на паметта ще нараства, оставяйки по-малко памет за други по-чести процеси, изтласквайки активността на пейджинг и в крайна сметка забавяйки компютъра.
Да кажем, че ще проектирате програма с основната форма и две допълнителни (модални) форми. Обикновено, в зависимост от вашата версия на Delphi, Delphi ще вмъкне формулярите в проектна единица (DPR файл) и ще включва ред за създаване на всички форми при стартиране на приложението (Application. CreateForm (...)
Линиите, включени в проекта, са от дизайн на Delphi и са чудесни за хора, които не са запознати с Delphi или тепърва започват да го използват. Това е удобно и полезно. Това също означава, че ВСИЧКИ формуляри ще бъдат създадени при стартиране на програмата, а НЕ когато са необходими.
В зависимост от това, за какво е вашият проект и функционалността, на която сте въвели формуляр, може да използва много памет, така че форми (или като цяло: обекти) трябва да бъдат създадени само когато са необходими и унищожени (освободени) веднага щом те вече не са необходимо.
И двете, "DialogForm" и "OccasionalForm" трябва да бъдат премахнати от списъка на "Автоматично създаване на формуляри" и преместени в списъка "Налични форми".
Моля, обърнете внимание, че стратегията, очертана тук, се основава на предположението, че въпросната програма е програма в режим „улавяне“ в реално време. Той обаче може да бъде лесно адаптиран за процеси от тип партида.
Delphi се опита да сведе до минимум това и има собствена архитектура за управление на паметта, която използва много по-малки блокове, но това е така практически безполезен в Windows среда, тъй като в крайна сметка разпределението на паметта зависи от операционната система.
След като Windows е разпределила блок памет за даден процес и този процес освобождава 99,9% от паметта, Windows все още ще възприема целия блок, който се използва, дори ако всъщност е само един байт от блока използва. Добрата новина е, че Windows предлага механизъм за почистване на този проблем. Черупката ни предоставя API, наречен SetProcessWorkingSetSize. Ето подписа:
По дефиниция функцията SetProcessWorkingSetSize задава минималните и максималните размери на работния комплект за указания процес.
Този API е предназначен да даде възможност за настройка на ниско ниво на минимални и максимални граници на паметта за пространството за използване на паметта на процеса. Има обаче малко странност, вградена в него, която е най-щастлива.
Ако и минималните и максималните стойности са зададени на $ FFFFFFFF, тогава API временно ще отреже зададения размер на 0, като го смени от паметта и веднага след това отскача обратно в RAM, той ще разполага с най-малкото минимално количество памет, разпределено му (всичко това се случва в рамките на няколко наносекунди, така че за потребителя трябва да бъде незабележимо).
Обаждане към този API ще се извършва само на определени интервали - не непрекъснато, така че изобщо не трябва да има въздействие върху производителността.
Сега, периодично проверявайте броя на последните отметки спрямо „Сега“ и ако разликата между двете е по-голяма от периода, считан за безопасен празен период, подрежете паметта.
Сега преценете след какъв период от време ще считате, че програмата е бездействаща. Решихме две минути в моя случай, но можете да изберете всеки период, който искате, в зависимост от обстоятелствата.
Да се адаптира този метод за дълги времена на обработка или пакетни процеси е съвсем просто. Обикновено ще имате добра идея къде ще започне дълъг процес (напр. Начало на четене на цикъла през милиони записи на базата данни) и къде ще завърши (край на цикъла за четене на базата данни).
Просто деактивирайте таймера си в началото на процеса и го активирайте отново в края на процеса.