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

Листинг 7.12.

Измерение времени выполнения отрезка программы

procedure TForm1.cmbTimeGoClick(Sender: TObject);

var

summ, arg, maxVal: Int64;

startTime, endTime: Cardinal;

begin

txtTimeResult.Text := \'Измерение…\

Refresh;

maxVal := StrToInt(txtTimeMaxVal.Text);

//Устанавливаем маскимальную точность таймера

timeSetTimerPeriod(timeGetMinPeriod());

startTime := timeGetTime(); //Начальный момент времени

//Суммируем 64-битные числа

//(как раз и измеряем время его выполнения)

summ := 0;

arg := 1;

while (arg <= maxVal) do

begin

Inc(summ, arg);

Inc(arg);

end;

endTime := timeGetTime(); //Конечный момент времени

//Восстанавливаем период таймера

timeRestoreTimerPeriod();

//Время выполнения операций (мс)

txtTimeResult.Text := IntToStr(endTime – startTime);

end;

Создание программного таймера высокой точности

В самом начале рассмотрения возможностей мультимедиа-таймера было сказано, что в его API заложена возможность создания программных таймеров. Это действительно так. Причем максимальная точность такого таймера может получиться довольно большой: на современных компьютерах создание программного таймера с периодом срабатывания 1 мс – не проблема. Правда, использовать максимальную частоту таймера вряд ли стоит: слишком велика вероятность ошибки как минимум на 1 мс.

Теперь уясним, что же за программный таймер мы создаем и чем он отличается от компонента Timer, помещаемого на форму. А отличается наш таймер, кроме высокой точности, тем, что его не нужно привязывать к окну (форме): при срабатывании стандартного компонента Timer окну, за которым он закреплен, посылается сообщение WM_TIMER. Создаваемый же нами таймер работает по-другому, что удобнее рассмотреть на примере.

...

timerID := timeSetEvent

(

StrToInt(txtTimeInterval.Text), //Интервал между

//срабатываниями таймера

timeGetMinPeriod(), //Точность таймера

TimerProc, //Адрес процедуры, вызываемой при каждом

//срабатывании таймера

0, //Параметр, передаваемый в процедуру

//обратного вызова

TIME_CALLBACK_FUNCTION or TIME_PERIODIC //Тип таймера

);

В приведенном выше отрывке программы с помощью функции timeSetEvent происходит регистрация и запоминание адреса процедуры TimerProc, вызываемой периодически при срабатываниях таймера. При успешном создании таймера функция timeSetEvent возвращает ненулевое значение – идентификатор созданного таймера. Оно может использоваться в дальнейшем для определения, какой именно таймер сработал. Значение, возвращенное функцией timeSetEvent, также необходимо при удалении таймера:

...

timeKillEvent(timerlD);

Функция timeKillEvent возвращает целочисленное значение:

• TIMERR_NOERROR – если ее вызов завершился успешно;

• MMSYSERR_INVALPARAM – если таймера, заданного параметром функции, не существует.

Теперь о процедуре, адрес которой мы передаем в функцию timeSetEvent. В нашем примере она выглядит следующим образом (листинг 7.13).

...

Листинг 7.13.

Процедура, вызываемая при срабатывании таймера

procedure TimerProc(uTimerID, uMessage: UINT; dwUser, dw1, dw2:

DWORD) stdcall;

begin

//Добавляем текущее значение времени в список (чтобы была

//видна разница между моментами вызова этой процедуры)

Form1.lstTimes.Items.Add(IntToStr(timeGetTime()));

end;

Естественно, действия, выполняемые процедурой TimerProc, могут быть самыми различными. В нашем случае происходит заполнение списка (List) значениями счетчика «тиков» таймера на момент вызова процедуры (рис. 7.5).

Рис. 7.5. Результат работы таймера

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных