Читаем О чём не пишут в книгах по Delphi полностью

На некоторых компьютерах в этом тесте с DDB-изображением наблюдается интересный эффект: время, измеренное программой, заметно меньше, чем время, когда картинка меняется на экране (например, пользователь ясно видит, что тест выполняется в течение примерно трех секунд, в то время как программа дает значение около одной секунды). Это связано со способностью некоторых видеокарт буферизовать переданные им команды и выполнять их асинхронно, т.е. вызов функции завершается очень быстро, программа продолжает работать дальше, а видеокарта параллельно ей выполняет команду. Если вы столкнетесь с такой ситуацией, можете провести небольшой эксперимент: вставить вызов функции Beep сразу после окончания второго теста. Вы услышите звуковой сигнал раньше, чем изображение закончит меняться.

Третий тест самый простой: Cnt раз значение свойства ScanLine присваивается переменной P. Так как значение P потом нигде не используется, компилятор выдает соответствующую подсказку, но в данном случае ее можно игнорировать.

Таким образом, метод DoTest нужно вызвать два раза: для DDB-изображения и для DIB это делает обработчик нажатия кнопки BtnStart (листинг 1.41).

Листинг 1.41. Обработчик нажатия кнопки BtnStart

procedure TForm1.BtnStartClick(Sender: TObject);

var

 IterCnt, RandomStart: Integer;

begin

 IterCnt := StrToInt(EditIter.Text);

 GridResults.Cells[1, 1] := '';

 GridResults.Cells[1, 2] := '';

 GridResults.Cells[1, 3] := '';

 GridResults.Cells[2, 1] := '';

 GridResults.Cells[2, 2] := '';

 GridResults.Cells[2, 3] := '';

 // Чтобы новый текст ячеек отобразился в GridResults,

 // нужно, чтобы было извлечено их очереди и обработано

 // сообщение WM_PAINT. Чтобы сделать это немедленно,

 // вызываем Application.ProcessMessages.

 Application.ProcessMessages;

 Random.Start := Random(MaxInt);

 Screen.Cursor := crHourGlass;

 // Точное измерение времени выполнения кода в Windows

 // невозможно, потому что это многозадачная система, и

 // часть измеренного времени может быть потрачена на

 // выполнение кода других процессов. Чтобы максимально

 // уменьшить погрешность измерения, нужно установить

 // наивысший приоритет процессу и его главной нити -

 // тогда вероятность переключения процессора на

 // выполнение другой задачи будет минимальным. Столь

 // высокий приоритет приводит к тому, что во время

 // выполнения теста система перестаёт реагировать на

 // перемещение мыши. Поэтому необходимо использовать блок

 // try/finally, чтобы даже при возникновении исключения

 // приоритет процесса и нити был снижен до нормального

 // уровня.

 SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);

 SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);

 try

  // В тестах активно используются псевдослучайные числа.

  // Чтобы сравнение было корректно, нужно, чтобы

  // последовательности чисел в экспериментах с DIB и DDB

  // были одинаковыми. Каждое следующее псевдослучайное

  // число генерируется на основе значения глобальной

  // переменной модуля System RandSeed. Значение RandSeed

  // при этом обновляется по определенному закону. Таким

  // образом, если установить определенное значение

  // RandSeed, то последовательность псевдослучайных чисел

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже