Листинг 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. Создаваемый же нами таймер работает по-другому, что удобнее рассмотреть на примере.