ZDOC_2549

Индикатор прогресса при обработке больших объёмов, дополнение 1

Дополнение к старой записи Индикатор прогресса при обработке больших объёмов.

* * *

Можно убить окно 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 секунд на миллион вызовов.

ЗЫ. Все цифры сняты со сферического сервера в вакууме. Ваши цифры имеют право быть другими.