Дополнение к старой записи Индикатор прогресса при обработке больших объёмов.
* * *
Можно убить окно SAP GUI в версии, если заспамить:
1 2 3 4 5 6 |
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 с дополнительными параметрами.
Можно указать не только текст, но и сообщение по номеру, да ещё и с параметрами:
1 2 3 4 |
cl_progress_indicator=>progress_indicate( EXPORTING i_msgid = 'ZFI077' i_msgno = '003' i_msgv1 = 'STEP 1' ). |
Можно не рассчитывать процент, а указать непосредственно итерационные значения:
1 2 3 4 5 6 7 8 9 |
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:
1 2 3 |
cl_progress_indicator=>progress_indicate( EXPORTING i_text = 'Processing...' i_output_immediately = ' ' ). |
Работает этот параметр следующим образом: после отправки обновления индикатора прогресса объявляется десятисекундный мораторий. Константа времени — hardcoded.
Выходит не очень гладко, но такой подход имеет право на существование.
* * *
Если вдруг наткнетесь на ФМ ‘PROGRESS_INDICATOR’, то можете проходить мимо него. Это просто обертка для класса CL_PROGRESS_INDICATOR, причем не самая лучшая.
Если приглядеться к ней внимательней, то внутри можно обнаружить динамический вызов:
1 2 3 |
CALL METHOD cl_progress_indicator=>(gc_meth) PARAMETER-TABLE lt_paramtab. |
Всё бы ничего, просто особого смысла в динамическом вызове тут нет, а дополнительные накладные расходы составляют примерно 25 секунд на миллион вызовов.
У прямого же вызова CL_PROGRESS_INDICATOR накладные расходы составляют примерно 5 секунд на миллион вызовов, что немного чересчур, если быть очень придирчивым. И если для вас это вдруг критично, то начальный подход уменьшит ваши накладные расходы до полусекунды на миллион итераций.
Кстати, накладные расходы на вызов ‘SAPGUI_PROGRESS_INDICATOR’ составляют примерно 330 секунд на миллион вызовов.
ЗЫ. Все цифры сняты со сферического сервера в вакууме. Ваши цифры имеют право быть другими.