Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие авар.doc
Скачиваний:
62
Добавлен:
02.09.2019
Размер:
2.34 Mб
Скачать

Выполнение расчетов в параллельных (фоновых) задачах

Некоторые вычислительные задачи можно выполнять параллельно, в несколько потоков. Это позволяет существенно сократить время выполнения программы.

Для реализации механизма необходимо определить функциональный модуль, выполняющий распараллеливаемую задачу, как дистанционный.

Рисунок 51

Необходимо помнить, что дистанционный модуль не может работать со ссылочными переменными: необходимо установить флаг «Перенос значений».

Рисунок 52

Вызов модуля осуществляется следующим образом:

* Счетчик количества параллельных процессов. Если количество не ограничивать, то

* появляется большая вероятность «повесить» сервер приложений.

    I_TK = 0.     LOOP AT LR_HEADER_DATA INTO LS_HEADER_DATA. * Ограничиваем кол-во параллельных процессов       WAIT UNTIL I_TK < 3. * Определяем имя задачи       S = LS_HEADER_DATA-LOGNUMBER.       CONCATENATE 'FUNC' S INTO S. * Вызов функции в фоновом режиме. При вызове в функцию передаются только

* экспортные параметры. Параметры возврата получаются в форме SET_FUNC_DONE       CALL FUNCTION 'Z_S_GET_MSG_LOG_PAR'         STARTING NEW TASK S         PERFORMING SET_FUNC_DONE ON END OF TASK         EXPORTING           LR_HEADER_DATA = LR_HEADER_DATA           LR_MESSAGES    = LR_MESSAGES           LR_CONTEXTS    = LR_CONTEXTS           I_LOGNUMBER    = LS_HEADER_DATA-LOGNUMBER. * увеличение счетчика активных процессов       I_TK = I_TK + 1.     ENDLOOP.     WAIT UNTIL I_TK = 0.     RECNUM = 0.

Форма, получающая параметры функции выглядит так:

FORM SET_FUNC_DONE USING TASKNAME.   DATA:         LR_RESREC_TMP1 LIKE LR_RESREC_TMP. * получение параметров импорта функции   RECEIVE RESULTS FROM FUNCTION 'Z_S_GET_MSG_LOG_PAR'   CHANGING           LR_RESREC_TMP  = LR_RESREC_TMP1.   APPEND LINES OF LR_RESREC_TMP1 TO LR_RESREC_TMP.

* уменьшение счетчика активных процессов   I_TK = I_TK - 1. ENDFORM.                    "SET_FUNC_DONE

Подпрограмма преобразования

Подпрограмма преобразования – это две программы, выполняющиеся при вводе данных в систему и при выводе пользователю. Пример подпрограммы преобразования - это ALPHA (встречается на вкладке «Общее» при изменении признака, если используется тип данных CHAR). Алгоритм её работы: при вводе/загрузке строки если строка является числом, то она дополняется нулями слева до максимальной длинны строки; при выводе/отображении ведущие нули убираются, если строка является числом. Использование ALPHA позволяет делать для системы строки типа «1» и «01» идентичными. Иногда полезно определить свою подпрограмму преобразования. Делается это путем создания двух функциональных модулей, имя которых задается по следующей маске:

«CONVERSION_EXIT_{имя подпрограммы преобразования}_INPUT» - ФМ, преобразующий данные при загрузке в BW.

«CONVERSION_EXIT_{имя подпрограммы преобразования}_OUTPUT» - ФМ, преобразующий данные BW при отображении пользователю.

Пример подпрограммы ALPHA можно посмотреть в любой системе BW.

Пример подпрограммы, преобразующей русские буквы к аналогичным английским:

FUNCTION CONVERSION_EXIT_TRRUS_INPUT. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *"  IMPORTING *"     VALUE(INPUT) TYPE  CLIKE *"  EXPORTING *"     VALUE(OUTPUT) TYPE  CLIKE *"----------------------------------------------------------------------   DATA:         S TYPE STRING,         S1 TYPE STRING,         I TYPE I,         L TYPE I,         C(1).   S = INPUT.   L = STRLEN( S ).   IF L > 0.     S1 = ''.     I = 0.     WHILE I < L.       C = S+I(1).       CASE C.         WHEN 'А'.           C = 'A'.         WHEN 'В'.           C = 'B'.         WHEN 'Е'.           C = 'E'.         WHEN 'К'.           C = 'K'.         WHEN 'М'.           C = 'M'.         WHEN 'Н'.           C = 'H'.         WHEN 'О'.           C = 'O'.         WHEN 'Р'.           C = 'P'.         WHEN 'С'.           C = 'C'.         WHEN 'Т'.           C = 'T'.         WHEN 'У'.           C = 'Y'.         WHEN 'Х'.           C = 'X'.       ENDCASE.       CONCATENATE S1 C INTO S1.       I = I + 1.     ENDWHILE.     OUTPUT = S1.   ELSE.     OUTPUT = ''.   ENDIF. ENDFUNCTION.

FUNCTION CONVERSION_EXIT_TRRUS_OUTPUT. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *"  IMPORTING *"     VALUE(INPUT) TYPE  CLIKE *"  EXPORTING *"     VALUE(OUTPUT) TYPE  CLIKE *"----------------------------------------------------------------------   DATA:         S TYPE STRING,         S1 TYPE STRING,         I TYPE I,         L TYPE I,         C(1).   S = INPUT.   L = STRLEN( S ).   IF L > 0.     S1 = ''.     I = 0.     WHILE I < L.       C = S+I(1).       CASE C.         WHEN 'А'.           C = 'A'.         WHEN 'В'.           C = 'B'.         WHEN 'Е'.           C = 'E'.         WHEN 'К'.           C = 'K'.         WHEN 'М'.           C = 'M'.         WHEN 'Н'.           C = 'H'.         WHEN 'О'.           C = 'O'.         WHEN 'Р'.           C = 'P'.         WHEN 'С'.           C = 'C'.         WHEN 'Т'.           C = 'T'.         WHEN 'У'.           C = 'Y'.         WHEN 'Х'.           C = 'X'.       ENDCASE.       CONCATENATE S1 C INTO S1.       I = I + 1.     ENDWHILE.     OUTPUT = S1.   ELSE.     OUTPUT = ''.   ENDIF. ENDFUNCTION.