![]() |
#11 |
Участник
|
бедняжка
добавьте X++: //mazzy 13.12.2019: по образцу getTotal() public int64 getCount(int _idx = 1) { if (oprProgress) return oprProgress.getCount_RU(_idx); else if (oprProgressEmbedded ) return oprProgressEmbedded.getCount_RU(_idx); else if ( oprProgressServer ) return oprProgressServer.getCount(_idx); else return 0; } Цитата:
Сообщение от oleggy
![]() Нумерация у меня идет с нуля.
Перед первым выполнением progress.incCount() значение progress.oprProgress.lapProgress равно 0. Как вы видете после запуска джоба я вижу только три изменения окна прогресс бара. ТРИ. Но если я раскомменчу progress.update(true) отображает корректно ЧЕТЫРЕ окна. Цитата:
Заглянул внутрь. Вспомнил. Заодно вспомнил про тему (Не)перерисовка окна клиента AX 2009 при длительных операциях - вариант решения Поностальгировал. ![]() Вернемся к вопросам. Прогресс-бар - это GUI-форма. Обновление GUI-формы - дело относительно не быстрое. Даже перерисовка консольного прогресс бара занимает время. Нормальные прогресс-бары не отрисовывают КАЖДОЕ изменение прогресса, а обновляют по таймеру, чтобы отрисовка не выполнялась дольше, чем полезная работа. Вот и в Аксапте у метода update есть параметр force: если сказать force=true, то update перерисует форму в обязательном порядке если сказать force=false, то update будет перерисовывать только когда пройдет некоторое время с предыдущей отрисовки. поначалу updateInterval равен трем попугаям для сервера и одному попугаю для клиента. по ходу пьесы, progressBar пытается отрегулировать updateInterval так, чтобы он был больше, чем время перерисовки окна. а также пытается показать себя сильно умным ГЛАВНОЕ: метод update(false) НЕ перерисовывает окно при каждом изменении. теперь собственно что происходит: 1. методы setText() и incCount() унутре себя вызывают update(false) следовательно возможна ситуация, когда на первом методе окно будет перерисовно, а на втором - не будет. так и получается рассогласованное изображение окна. но вполне согласованое состояние внутри. 2. когда вы явно вызываете update(true), то окно будет принудительно перерисовано. И каким бы оно ни было нарисовано в предыдущих строках, здесь оно будет нарисовано в согласованном состоянии. 3. попробуйте тест на очень много значений с принудительной отрисовкой и с отрисовкой по умолчанию. замерьте время выполнения. скорее всего вы удивитесь как много времени уходит на отрисовку прогрессБара. мало того, и на обслуживание этой счетчиков тоже тратится время и дополнительно напрягается сборщик мусора. на некоторых проектах даже запрещают использовать прогресс-бар совсем (не рекомендую). 4. что делать: не ориентироваться на точные значения прогресс-бара. выводить текст для того, чтобы примерно представлять где мы находимся (даты обрабатываемых проводок, код товаров в алфавитном порядке и тп) увеличивать updateInterval (рекомендую 5-10 секунд) 5. что можно улучшить: в стандартной аксапте катастрофически не хватает метода, который меняет одновременно и текст, и счетчик. такой метод обычно и добавляют на проектах. Последний раз редактировалось mazzy; 02.10.2020 в 20:25. |
|
|
За это сообщение автора поблагодарили: sukhanchik (10), oleggy (1). |