Цитата:
Сообщение от
oleggy
Уже весь извелся. Одни маты остались.
бедняжка
Цитата:
Сообщение от
oleggy
К сожалению нет такого метода (DAX2009).
добавьте
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
Поэтому смотрел через дебаг.
Серьезно? Не, это не спортивно.
Цитата:
Сообщение от
oleggy
Нумерация у меня идет с нуля.
Перед первым выполнением progress.incCount() значение progress.oprProgress.lapProgress равно 0.
Как вы видете после запуска джоба я вижу только три изменения окна прогресс бара. ТРИ.
Но если я раскомменчу progress.update(true) отображает корректно ЧЕТЫРЕ окна.
как у меня на скриншотах ниже. так?
Цитата:
Сообщение от
oleggy
Я почему тему поднял, просто хотелось понять:
1. почему ТАК криво отображается прогресс бар?
2. после какого оператора происходит обновление окна Импорт? Какой метод это делает? Или после какого метода это происходит?
Хорошие вопросы. И хорошая настойчивость. Спасибо.
Заглянул внутрь. Вспомнил.
Заодно вспомнил про тему
(Не)перерисовка окна клиента 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.
что можно улучшить:
в стандартной аксапте катастрофически не хватает метода, который меняет одновременно и текст, и счетчик.
такой метод обычно и добавляют на проектах.