Работа с памятью
В процессе написания программного обеспечения в ряде случаев возникает необходимость получения данных из физических ячеек памяти. Документации Delphi по данному вопросу, я найти не смог, поэтому хочу восполнить данный пробел.
Платформа WinNT(XP) не допускает возможность непосредственного доступа к памяти средствами Win32API. В этом случае программист должен или написать свой драйвер доступа к физической памяти или использовать native kernel32 функции ядра.
Рассмотрим второй вариант использующий объект "проекция файла" (file-mapping object), представляющем собой блок памяти(раздел) доступный двум и более процессам для совместного использования.
Совместное использование данных с помощью объекта "раздел" происходит следующим образом: Задав атрибуты с помощью функции
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Работа с памятью
Сегодня мы попытаемся написать программу, которая будет показывать состояние памяти компа. Для начала определим что она будет делать. Ну самое главное что нам нужно, это сотояние физической памяти и загруженность ее в %. А дальше, по своему вкусу, добавим еще состояние виртуальной и страничной памяти. Начнем. Создай новый проект на Делфи ( File->New->Application). Теперь подумай, как тебе удобней отображать состояние памяти. Для меня лучше в Label, но можно и Edit. Ну это на твое усмотрение. Кидай на форму 7 компонентов Label (в них будет отображаться значение) и еще 7 (это будут пояснения: загруженность, всего физической, использовано физической, всего страничной, использовано страничной, всего виртуальной, использовано виртуальной). Какие не нужны, те отбрось ;) . Теперь кинь таймер (из вкладки System). Это будет наш главный элемент., поэтому поставь интервал по своему усмотрению (у меня он 400). Этот интервал будет отвечать за частоту обновления полей. Ну и для красоты брось ProgressBar ( из вкладки Win32). У тебя должно получиться что-то типа этого: Теперь приступим непосредственно к кодингу. Весь код мы будем писать в процедуру запуска таймера. А вот и код:
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Работа с памятью
Code: |
var Status : TMemoryStatus; begin Status.dwLength := sizeof( TMemoryStatus ); GlobalMemoryStatus( Status ); ... |
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Работа с памятью
Для этого можно воспользоваться функцией GetHeapStatus:
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Работа с памятью
Например через атомы:
К счастью количество атомов ограничено 0xFFFF, так что простые функции перебора работают достаточно быстро. Вот пример как сохранять и читать значение через атомы:
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Работа с памятью
Code: |
function GetMemoryTotalPhys : DWord; var memStatus: TMemoryStatus; begin memStatus.dwLength := sizeOf ( memStatus ); GlobalMemoryStatus ( memStatus ); Result := memStatus.dwTotalPhys; end; |
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Работа с памятью
Addr Возвращает указатель на объект.
AllocMem Выделяет на куче блок памяти заданного размера, заполняет его нулями и возвращает указатель на начало блока.
CompareMem Выполняет бинарное сравнение двух участков памяти.
GetHeapStatus Возвращает текущее состояние диспетчера памяти.
GetMemoryManager Возвращает значения указателей полей текущего диспетчера памяти.
IsMemoryManagerSet Определяет, используется в настоящий момент диспетчер памяти, установленный по умолчанию, или был установлен другой диспетчер.
Ptr Возвращает указатель на адрес памяти, переданный в качестве аргумента.
SizeOf Возвращает размер памяти, занимаемый переменной.
SetMemoryManager Устанавливает значения полей диспетчера памяти.
SysFreeMem Высвобождает память, используемую динамической переменной.
SysGetMem Выделяет блок памяти заданного размера и возвращает указатель на него.
SysReallocMem Изменяет размер динамически распределенного блока памяти.
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Работа с памятью