//..использование виртуальной памяти
txtVirtualTotal.Text := IntToStr(memStat.dwTotalVirtual div 1024);
txtVirtualAvail.Text := InttoStr(memStat.dwAvailVirtual div 1024);
end;
Внешний вид формы, элементы управления которой заполняются значениями в листинге 7.6, показан на рис. 7.3.
Рис. 7.3. Программа для определения состояния памяти компьютера
Напоследок рассмотрим (несколько упрощенно), что за результаты выводятся в текстовых полях формы, для тех, кто немного не в курсе, как организовано управление памятью в ОС Windows.
Итак, каждому процессу Windows предоставляет адресное пространство (виртуальное) размером чуть меньше 2 Гбайт. В отличие от 16-битных предшественниц, в 32-битных Windows адресные пространства различных процессов являются закрытыми: приложение использует память (а точнее, младшие 2 Гбайт адресного пространства) единолично и не может без дополнительных усилий манипулировать данными других процессов. Значения в двух последних полях CTpyKTypbiTMemoryStatus (и нижняя группа текстовых полей на форме рис. 7.3) как раз и показывают использование приложением предоставляемого ему адресного пространства.
Механизм виртуальной памяти является довольно удобной надстройкой, скрывающей ограниченность аппаратных ресурсов компьютера. Ограниченный объем оперативной памяти компенсируется использованием места на диске (файла подкачки, страничного файла). В этот файл записываются для временного хранения неиспользуемые страницы памяти (блоки данных по несколько Кбайт), давая возможность помещать другие данные, нужные приложению, в оперативную память.
Теперь вернемся к форме, показанной на рис. 7.3. Группа текстовых полей Оперативная память показывает полный и свободный объем реально установленной на компьютере оперативной памяти (за вычетом памяти, используемой для системных нужд). Использование этого вида памяти иллюстрирует индикаторРгодгезБВаг на форме. Назначение правой группы текстовых полей (Файл подкачки) должно быть также очевидным.
Из цифр, выведенных в текстовые поля на форме (рис. 7.3), можно также определить, что общий объем памяти, доступной приложениям (всего было запущено 30 процессов), на испытуемом компьютере составлял около 1,26 Гбайт. Если представить, что память использовалась всеми процессами одинаково, то получается примерно 43 Мбайт на каждого, не считая памяти, резервируемой для самой ОС Windows.
Этот раздел посвящен отнюдь не простому получению текущего времени или даты (благо эти функции можно найти и в библиотеке Borland). Здесь мы обратимся к несколько более интересной теме – использованию системных средств измерения малых промежутков времени.
Все рассмотренные далее способы измерения времени основаны на подсчете количества «тиков» таймера. Для сохранения показаний таймера система поддерживает соответствующие счетчики. Для определения временного интервала получаем показания счетчика в начале и в конце промежутка времени. Находим разность между полученными показаниями и, если период таймера не соответствует требуемой единице измерения (например, мс), делим разность на частоту таймера.
Давно ли запущена операционная система?
С момента своего запуска Windows начинает наращивание значения специального счетчика, показывающего количество «тиков» (в миллисекундах), прошедших с момента запуска системы.
Таким образом, этот системный счетчик «тиков» можно использовать как для определения времени работы системы, так и для измерения временных интервалов. Для доступа к нему можно использовать API-функцию GetTickCount. Она не имеет параметров и возвращает целочисленное 32-битное значение.
Приведенная в листинге 7.7. функция GetSystemWorkTime демонстрирует использование счетчика «тиков» для определения времени работы системы в часах, минутах и секундах.
...
Листинг 7.7.
Определение времени работы системы
function GetSystemWorkTime(): String;
var
ticks: DWORD;
hh, mm, ss: Cardinal;
begin
//Получаем количество миллисекунд с момента старта системы
ticks := GetTickCount();
//Переводим в секунды
ticks := ticks div 1000;
//Получаем количество часов, минут, секунд
hh := ticks div 3600;
Dec(ticks, hh * 3600);
mm := ticks div 60;
Dec(ticks, mm * 60);
ss := ticks;
GetSystemWorkTime := IntToStr(hh) + \':\' +
IntToStr(mm) + \':\' + IntToStr(ss);
end;
Из-за относительно малой разрядности значение счетчика обнуляется приблизительно каждые 49,7 суток, что следует учитывать при измерении длительных интервалов или если измерение времени начинается после длительной работы системы (например, начало измерения выпадает на 50-е сутки за час до обнуления счетчика).
Читать дальше
Конец ознакомительного отрывка
Купить книгу