Читаем Delphi. Трюки и эффекты полностью

Приведенная в листинге 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;

Перейти на страницу:

Похожие книги

Забытое
Забытое

Захватывающая история Сиенны Престон продолжается во второй части головокружительной серии «Игра обмана».Семнадцатилетняя Сиенна не понаслышке знает о душевной боли и потерях. Но на этот раз всё по-другому: кто-то вмешался в воспоминания её возлюбленного, и теперь ей предстоит найти ответы.След ведёт её к сверкающим небоскрёбам и роскоши Рубекса, столицы Пасифики, где она проникает в правительственное Ведомство интеллекта и генетики. Но ответы получить не так-то просто, особенно когда её собственные воспоминания могут быть искажены. К счастью, рядом есть Зейн Райдер, готовый помочь ей сложить вместе кусочки головоломки. Его преданность и забота размывают границу между дружбой и чем-то большим.Когда Сиенна подбирается слишком близко к тёмным секретам Ведомства, её обвиняют в убийстве видного государственного деятеля, и ей приходится пуститься в бега. Как бы ни разрывалось сердце Сиенны в попытке понять, кого она любит, это всё вскоре перестаёт иметь значение — потому что единственное, что её сейчас ждёт, это смертный приговор.

Марина Козикова , Александр Степанович Грин , Марина Суржевская , Кристин Смит

Любовное фэнтези, любовно-фантастические романы / Проза / Классическая проза / Самиздат, сетевая литература / Технические науки / Любовно-фантастические романы