Главная » Delphi » О работе с индикаторами длительности процесса

0

Несколько слов о работе с ползунками, которые отображают время длительного процесса. Вместо стандартного ProgressBar можно взять более продвинутый Gauge (закладка Samples), но в этой книге мы этого делать не будем, т. к. он тормозит процесс уже до совершенно неприемлемых величин. Для того чтобы проиллюстрировать обращение с разными типами ползунков и протестировать их возможности, я расположил на диске в папке Glaval3\Polzunok демонстрационную программу Polzunok. В ней примерно 100-килобайтный файл (наша картинка из SlideShow 0klen2.jpg) читается побайтно в строку (о том, как это делается, см. главу 21). До этого и после этого системным таймером фиксируется время и выводится длительность процесса в секундах. Рассматриваем четыре случая: вообще без графического ползунка (с выводом процентов выполнения в текстовой форме в компонент Label), со стандартными ProgressBar и Gauge, а также с самостоятельно сконструированным ползунком на основе компонентов image и Panel. Ручаюсь, что вы будете несколько ошеломлены результатами: на моем относительно медленном компьютере длительность процедуры без графического сопровождения составила 2 секунды, с компонентом ProgressBar— 55 секунд, а с компонентом Gauge— целых 130 секунд, в 65 раз медленнее! При этом наш самодельный ползунок дает фору "официальным" компонентам — с ним длительность составила 46 секунд. Однако не сомневаюсь, что если на его основе сделать собственный компонент, то "классовая" обертка замедлит процесс, и никакого выигрыша мы по сравнению с ProgressBar уже не получим, поэтому возиться, видимо, не стоит. Конечно, на компьютерах с другими видеосистемами, более быстрым процессором и доступом к памяти результаты будут другими, но соотношение вряд ли изменится принципиально. В DOS я бы не задумался над тем, чтобы написать свой собственный ползунок с прямым выводом в видеопамять (см. на эту тему замечание в главе 8), но в Windows это настолько громоздкое занятие, притом с непредсказуемым результатом в отношении выигрыша во времени, что в критичных случаях проще обойтись вообще без ползунка.

Чтобы сократить впустую потраченное время, можно увеличить шаг step и вызывать процедуру stepit не каждый раз, а, к примеру, каждый десятый. Но это может привести ко всяким дерганиям, если файлов мало, и к усугублению неприятного эффекта, когда по окончании процесса полоска не доходит до конца. Так что решайте сами — для того чтобы вызывать stepit, например, каждый десятый раз, в нашей программе Trace достаточно поставить условие if (nfile>0) and (nfile mod 10 = 0).

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии