Дополнение к старой записи Индикатор прогресса при обработке больших объёмов.
* * *
Можно убить окно SAP GUI в версии, если заспамить:
DO 50000 TIMES.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 1
text = 'Processing...'.
ENDDO.
Проверено на SAP GUI 7.40 Patch Level 5
* * *
Кроме ФМ ‘SAPGUI_PROGRESS_INDICATOR’, есть ещё класс CL_PROGRESS_INDICATOR с дополнительными параметрами.
Можно указать не только текст, но и сообщение по номеру, да ещё и с параметрами:
cl_progress_indicator=>progress_indicate(
EXPORTING i_msgid = 'ZFI077'
i_msgno = '003'
i_msgv1 = 'STEP 1' ).
Можно не рассчитывать процент, а указать непосредственно итерационные значения:
lv_tot = lines( gt_data ).
LOOP AT gt_data ASSIGNING FIELD-SYMBOL().
lv_idx = sy-tabix.
cl_progress_indicator=>progress_indicate(
EXPORTING
i_text = 'Processing...'
i_processed = lv_idx
i_total = lv_tot ).
ENDLOOP.
Для предотвращения спама есть параметр I_OUTPUT_IMMEDIATELY:
cl_progress_indicator=>progress_indicate(
EXPORTING i_text = 'Processing...'
i_output_immediately = ' ' ).
Работает этот параметр следующим образом: после отправки обновления индикатора прогресса объявляется десятисекундный мораторий. Константа времени – hardcoded.
Выходит не очень гладко, но такой подход имеет право на существование.
* * *
Если вдруг наткнетесь на ФМ ‘PROGRESS_INDICATOR’, то можете проходить мимо него. Это просто обертка для класса CL_PROGRESS_INDICATOR, причем не самая лучшая.
Если приглядеться к ней внимательней, то внутри можно обнаружить динамический вызов:
CALL METHOD cl_progress_indicator=>(gc_meth)
PARAMETER-TABLE
lt_paramtab.
Всё бы ничего, просто особого смысла в динамическом вызове тут нет, а дополнительные накладные расходы составляют примерно 25 секунд на миллион вызовов.
У прямого же вызова CL_PROGRESS_INDICATOR накладные расходы составляют примерно 5 секунд на миллион вызовов, что немного чересчур, если быть очень придирчивым. И если для вас это вдруг критично, то начальный подход уменьшит ваши накладные расходы до полусекунды на миллион итераций.
Кстати, накладные расходы на вызов ‘SAPGUI_PROGRESS_INDICATOR’ составляют примерно 330 секунд на миллион вызовов.
ЗЫ. Все цифры сняты со сферического сервера в вакууме. Ваши цифры имеют право быть другими.