Валерий Борисок - Delphi. Трюки и эффекты
- Название:Delphi. Трюки и эффекты
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валерий Борисок - Delphi. Трюки и эффекты краткое содержание
«Delphi. Трюки и эффекты», как и все издания данной серии, адресована тем, кто хочет научиться делать с помощью уже знакомых программных пакетов новые, интересные вещи. В первой части книги многое говорится о среде разработки Delphi (самых последних версий) и программировании на языке Object Pascal. Благодаря этому издание подходит и новичкам, и начинающим программистам. Вторая (основная) часть книги описывает удивительные возможности, скрытые в языке, и на примерах учит читателя программистским фокусам – от «мышек-невидимок» и «непослушных окон» до воспроизведения МРЗ и управления офисными программами Word и Excel из приложений Delphi. Купив эту книгу, вы пройдете непростой путь к вершинам программистского мастерства весело и интересно.
Delphi. Трюки и эффекты - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
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 приводится возможная реализация функций для определения характеристик мультимедийного таймера.
Листинг 7.10.
Определение характеристик мультимедиа-таймера
//Получение максимального периода таймера (мс)
function timeGetMaxPeriod(): Cardinal;
var
time: TTimeCaps;
begin
timeGetDevCaps(Addr(time), SizeOf(time));
timeGetMaxPeriod := time.wPeriodMax;
end;
//Получение минимального периода таймера (мс)
function timeGetMinPeriod(): DWORD;
var
time: TTimeCaps;
begin
timeGetDevCaps(Addr(time), SizeOf(time));
timeGetMinPeriod := time.wPeriodMin;
end;
Итак, мы знаем, как получать параметры таймера. Но было сказано, что его точность можно регулировать. Делается это при помощи функций timeBeginPeriod и timeEndPeriod.
• Первая функция вызывается для установления минимальной точности таймера, которая устраивает приложение. Функция timeBeginPeriod принимает значение требуемой точности таймера в миллисекундах, возвращает TIMERR_NOERROR в случае успеха либо Т IMERR_NOCANDO, если требуемая точность не может быть обеспечена.
Читать дальшеИнтервал:
Закладка: