gifts2017

глПрогресс(). Индикатор прогресса с оценкой времени в виде: Обработано: 15%. Осталось: 00:01:15.

Опубликовал Александр Тарасенков (tarasenkov) в раздел Программирование - Практика программирования

Текст "Обработано: 3%. Осталось: 00:15:10" гораздо содержательнее текста "Обработано: 100 из 3467".

Такая информация позволит вашим пользователям спланировать и потратить время,
пока выполняется обработка более эффективно.
Особенно когда обработка длится несколько минут и более.
Функция отображения прогесса, с заранее известным числом итераций цикла.
Показывает в строке состояния текст обрабоки, процент выполнения (%)
и время до завершения обработки в виде:

Обработано: 15%. Осталось: 00:01:15.

Пример использования:
квсего = тз.КоличествоСтрок(); // тз - заполненная ТаблицаЗначений
глПрогрессСоздать(квсего);
тз.ВыбратьСтроки();
Пока тз.ПолучитьСтроку() = 1 Цикл
  глПрогресс();
  // ... Обработка строки
КонецЦикла;

Область применения:

Длительные обработки, такие как заполнение, проведение, печать документов,
формирование отчетов, выполнение расчетов, экспорт данных,
везде где можно заранее определить число итераций цикла.

Описание глПрогрессСоздать():
//-----------------------------------------------------
// Инициация прогресса для заранее известного числа итераций
// Всего            - число элементов в выборке
// ПериодОбновления - число милисекунд после которого обновить сторку состояния
// ОтВремени        - 1 - обновлять от времени, 
//                    0 - обновлять каждые ПериодОбновления значения счетчика
// ВыводитьПрошло   - 1 - выводить сколько времени прошло в виде: Прошло: 00:00:30
// ВыводитьТочность - 1 - выводить первоначальную оценку и ее точность в виде: 
//                        Нач.оценка: 00:01:02 (качество: 95 %)
//
// Все используемые переменные глобальные, для упрощения вызова глПрогресс()
// 
Процедура глПрогрессСоздать(Всего, СтрокаСостояния = "Обработано: ", 
  ПериодОбновления = 100, ОтВремени = 1, ВыводитьПрошло = 0, ВыводитьТочность = 0) 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ProgressTimeRemain.zip
.1195302085 5,71Kb
25.09.09
162
.1195302085 5,71Kb 162 Бесплатно

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Михаил Семенов (Shaman100M) 18.11.07 20:31
Приветствую. Имею свою подобную разработку, http://infostart.ru/profile/8196/projects/1330/ и http://infostart.ru/profile/8196/projects/810/ , поэтому было интересно посмотреть и сравнить:

- глПрогресс() можно ускорить работу, возможно, упростив алгоритм и отказавшись от медленного списка значений: все равно нормальной точности на "нелинейном" цикле в начале расчетов не добиться.
- добавить скриншоты
- думал, что играя с периодом обновления добьюсь лучшей скорости выполнения, - оказалось, на скорость не влияет. :)
- не всегда число итераций известно. Оставить "Обработано: 100 из ..." ?

В целом неплохо. +
tarasenkov; +1 Ответить
2. Tarasenkov (tarasenkov) 18.11.07 21:22
- Согласен, не всегда, в таком случае оставляю "Обработано: 100", а из скольки не вывожу :).
- На скорость незначительно влияет лишь выполнение функции _GetPerformanceCounter(), в остальном получается примерно также как и "Если к % 10 = 0 Тогда Состояние(...)".
- Список значений используется опционально, обращение к нему идет только при выводе точности первоначального прогноза, и как показывает профилирование, затраты времени на обращение к нему ничтожно малы (0.02% от выполнения глПрогресс()). На самом деле он используется лишь для того, чтобы после цикла вывести данные о точности прогноза на этапах 10%, 20% и т.д. т.е. с практической точки зрения он совершенно бесполезен, так игрушка.
- По поводу скриншотов, справедливое замечание, и все же изображение не заменит удовольствия лицезреть как знакомая до боли обработка сообщает о том сколько времени она займет.
3. Михаил Семенов (Shaman100M) 18.11.07 22:06
" - На скорость незначительно влияет лишь выполнение функции _GetPerformanceCounter(), в остальном получается примерно также как и "Если к % 10 = 0 Тогда Состояние(...). ", - не, не она.
Функция Цел() отъедает половину времени, и выполняется при каждом обращении к глПрогресс()
Код
 ЗначенияОбновления = Цел(...); 
Показать полностью
4. Tarasenkov (tarasenkov) 18.11.07 22:26
Функция Цел() почему-то выполняется на 25% быстрее чем % (остаток от деления), вот такая вот оптимизация :)
5. Аркадий Кучер (Abadonna) 19.11.07 04:50
Лет 5 назад написал прогрессор с оценкой времени, потом пришел к выводу, что все это, цитирую автора
"с практической точки зрения он совершенно бесполезен, так игрушка".
Могу точно сказать, что отъедает много времени - "Если"
6. Михаил Семенов (Shaman100M) 19.11.07 08:44
7. Аркадий Кучер (Abadonna) 19.11.07 09:27
Кстати, poppy меня убедила (после того как я сам проверил):
конструкция В=?(А<Б, 1,0); работает процентов на 30% как минимум быстрее, чем
Если А<Б Тогда
В=1;
Иначе
В=0;
КонецЕсли;
не особо понятно почему, но факт
8. Михаил Семенов (Shaman100M) 19.11.07 10:06
(7) меньше букв :) или разработчики методов разные.

У меня получилось 17-18%. Присвоение можно заменить, а вот условие вывода Состояние() - нет, - вывести в функцию с использованием ?() эффекта не дает.
9. Сhe Burashka (CheBurator) 19.11.07 19:36
деление нацело - жутко тормозная, конструкция вида
Если ТекИндикатор = ГраницаИндикатор Тогда
Состояние(ТекИндикатор)
ГраницаИндикатор = ГраницаИндикатор + ШагПрогресса
КонецЕсли;
- РАБОТАЕТ НА ПОРЯДОК БЫСТРЕЕ.
если число итераций невелико - это несущественно, если заюзаете ТЗ под лимон записей - набежит весьма прилично
Crush; tarasenkov; +2 Ответить 1
10. Михаил Семенов (Shaman100M) 19.11.07 19:58
11. Tarasenkov (tarasenkov) 19.11.07 21:54
Обновил, спасибо Che Burashka за пример!
12. Аркадий Кучер (Abadonna) 21.11.07 10:18
>Присвоение можно заменить, а вот условие вывода Состояние() - нет, - вывести в функцию с использованием ?() эффекта не дает.
Распрекрасно работает таким образом:
Код
Функция Вывести()
   Сообщить("ОК");
   Возврат 0;
КонецФункции

Процедура Сформировать()      
   Б=2;
        А=?(Б<3,Вывести(),0);
КонецПроцедуры
Показать полностью
13. Михаил Семенов (Shaman100M) 21.11.07 10:42
>Присвоение можно заменить, а вот условие вывода Состояние() - нет, - вывести в функцию с использованием ?() эффекта не дает.

В (8) как раз и имелось ввиду (12) , что команду Состояние() вывести в функцию ( в (12) это Вывести() ) , а функцию использовать внутри конструкции ?()

Работает распрекрасно, но по скорости также как и Если - Тогда - Иначе.
14. Аркадий Кучер (Abadonna) 21.11.07 10:49
Ну это не проверял, спорить не буду...
15. Денис (dolce) 01.12.07 19:11
думаю в курсаче зачтется как плюс
16. колесников Дмитрий (ВосточныйПарень) 13.12.07 06:55
Не наглядный индикатор, бухи многие любят чтобы реальный прогрессбар был
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа