Чтение онлайн

на главную

Жанры

Шрифт:

Два последние поля структуры TMemoryStatus относятся к приложению, вызывающему функцию GlobalMemoryStatus. Они рассмотрены чуть ниже. Пример использования функции GlobalMemoryStatus приведен в листинге 7.6.

...

Листинг 7.6.

Определение состояния памяти

procedure TForm1.LoadMemoryInfo;

var

memStat: TMemoryStatus;

begin

memStat.dwLength := SizeOf(memStat);

//Получение информации о загрузке памяти

GlobalMemoryStatus(memStat);

//Заполнение полей формы

//..% использования памяти

pbMemUsage.Position := memStat.dwMemoryLoad;

lblMemUsage.Caption := IntToStr(memStat.dwMemoryLoad) + \'%\

//..использование оперативной памяти

txtMemTotal.Text := IntToStr(memStat.dwTotalPhys div 1024);

txtMemAvail.Text := InttoStr(memStat.dwAvailPhys div 1024);

//..использование

файла подкачки

txtPageTotal.Text := IntToStr(memStat.dwTotalPageFile div 1024);

txtPageAvail.Text := InttoStr(memStat.dwAvailPageFile div 1024);

//..использование виртуальной памяти

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.

7.2. Системное время

Этот раздел посвящен отнюдь не простому получению текущего времени или даты (благо эти функции можно найти и в библиотеке 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-е сутки за час до обнуления счетчика).

Аппаратный таймер

Следующий рассматриваемый способ измерения времени основан на использовании таймера высокого разрешения (высокочастотного). Временной промежуток между «тиками» этого таймера может быть намного меньше 1 мс, что позволяет производить достаточно точные измерения. Для сохранения количества «тиков» аппаратного таймера используется 64-битный счетчик.

Пример получения значения счетчика аппаратного таймера приводится в листинге 7.8. Частота, возвращаемая функцией hwTimerGetCounter, измеряется в Гц (с-1), то есть означает количество срабатываний таймера в 1 с.

...

Листинг

7.8. Получение значения счетчика аппаратного таймера

function hwTimerGetCounter: Int64;

var

freq: Int64;

begin

if QueryPerformanceCounter(freq) <> False then

hwTimerGetCounter := freq

else

hwTimerGetCounter := 0; //Ошибка

end;

Чтобы перевести количество «тиков» аппаратного таймера в привычные нам единицы измерения, нужно узнать его частоту. В этом нам поможет функция, приведенная в листинге 7.9.

...

Листинг 7.9.

Определение частоты аппаратного таймера

function hwTimerGetFreq: Int64;

var

freq: Int64;

begin

if QueryPerformanceFrequency(freq) <> False then

hwTimerGetFreq := freq

else

hwTimerGetFreq := 0; //Ошибка

end;

Пусть нам известна разность между значения счетчика в начале и конце измерения. Перевести ее в секунды можно следующим образом:

...

time:= counter div hwTimerGetFreq;

Пример, а точнее, результат определения характеристик аппаратного таймера приведен на рис. 7.4.

Рис. 7.4. Характеристики аппаратного таймера

Заполнение приведенных на рис. 7.4 текстовых полей осуществляется чрезвычайно просто, поэтому код, описывающий это, в тексте не приводится. При желании вы сможете найти его на диске, прилагаемом к книге, в папке с названием раздела.

Мультимедиа-таймер

Рассмотрим еще один способ измерения, основанный на использовании так называемого мультимедиа-таймера. Его использование удобно тем, что появляется возможность задания его точности. Группа API-функций работы с мультимедиа-таймером позволяет не только измерять временные интервалы, но и создавать программные таймеры (см. компонент Timer), срабатывающие через гораздо меньшие промежутки времени.

Для получения текущего значения счетчика мультимедийного таймера можно воспользоваться функцией timeGetTime. Вообще, она возвращает значения, аналогичные значениям, возвращаемым функцией GetTickCount. Счетчик также 32-битный, обнуляемый приблизительно каждые 49,7 суток. Прототип функции timeGetTime следующий:

...

function timeGetTime: DWORD; stdcall;

Пример использования этой функции приведен в листинге 7.12, а теперь несколько слов о том, как получить для рассматриваемого таймера значения минимальной и максимальной точности. Для получения этих данных можно использовать функцию timeGetDevCaps. Она принимает в качестве параметра структуру TTimeCaps и заполняет два ее поля соответствующими значениями. В листинге 7.10 приводится возможная реализация функций для определения характеристик мультимедийного таймера.

Поделиться:
Популярные книги

Ты не мой Boy 2

Рам Янка
6. Самбисты
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Ты не мой Boy 2

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Энфис. Книга 1

Кронос Александр
1. Эрра
Фантастика:
боевая фантастика
рпг
5.70
рейтинг книги
Энфис. Книга 1

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Возвращение Низвергнутого

Михайлов Дем Алексеевич
5. Изгой
Фантастика:
фэнтези
9.40
рейтинг книги
Возвращение Низвергнутого

Последний Паладин. Том 5

Саваровский Роман
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 5

Вечная Война. Книга V

Винокуров Юрий
5. Вечная Война
Фантастика:
юмористическая фантастика
космическая фантастика
7.29
рейтинг книги
Вечная Война. Книга V

Архил...? Книга 2

Кожевников Павел
2. Архил...?
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Архил...? Книга 2

Золотая осень 1977

Арх Максим
3. Регрессор в СССР
Фантастика:
альтернативная история
7.36
рейтинг книги
Золотая осень 1977

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Приручитель женщин-монстров. Том 2

Дорничев Дмитрий
2. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 2

Его наследник

Безрукова Елена
1. Наследники Сильных
Любовные романы:
современные любовные романы
эро литература
5.87
рейтинг книги
Его наследник

Не грози Дубровскому! Том Х

Панарин Антон
10. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том Х

Игра топа. Революция

Вяч Павел
3. Игра топа
Фантастика:
фэнтези
7.45
рейтинг книги
Игра топа. Революция