Текущее время: Пт, июл 18 2025, 03:16

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Отслеживание завершения фона (Task)
СообщениеДобавлено: Пн, июл 28 2014, 13:34 
Начинающий
Начинающий

Зарегистрирован:
Пт, мар 14 2014, 15:59
Сообщения: 10
Здравствуйте, уважаемые!

Может кто сталкивался или подскАжите.

В ФМ1 в цикле запускаю ФМ2 но уже в ТАСКЕ (обарботка файлов в несколько потоков)

Code:
..
do N times.
  move N to ntask.
  concatenate 'task' ntask into task.
  call function ФМ2 new task task
enddo.
...


Задача: дождаться когда все ТАСКи отработают и только тогда продолжить код после enddo.

Нашел способ использования
Code:
call function ФМ2 new task task
performing return_data on end of task



Подпрограмма должна запускаться после отработки ФМ2 (который работает ТАСКе)
Code:
form return_data using task.
receive results from function ФМ2
   importing
...


Не совсем понимаю, как это можно использовать в моем случае. Я предполагаю, что после enddo. я запущу бесконечный цикл, которые будет выполняться, пока я не дождусь опеределенных данных, которые мне вернет Подпрограмма в ФМ1 и только после этого продолжу код. Как это реализовать? Почему-то не получается...

Спасибо.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Отслеживание завершения фона (Task)
СообщениеДобавлено: Пн, июл 28 2014, 16:45 
Почетный гуру
Почетный гуру

Зарегистрирован:
Пт, дек 04 2009, 12:52
Сообщения: 219
Один вариант:
1) объявляете переменную (счетчик);
2) там, где делаете вызов ФМ2, надо увеличивать счетчик на 1;
3) в callback-подпрограмме return_data - уменьшать счетчик на 1;
4) чтобы дождаться выполнения всех задач - ставьте бесконечный цикл, с выходом по условию счетчик = 0.

Ещё вариант:
1) объявляете внутр.таблицу с единственным полем task (это будет ваш стек вызовов);
2) там, где делаете вызов ФМ2, будете добавлять в таблицу-стек строчку с наименованием задачи;
3) в callback-подпрограмме return_data - удаляете из таблицы-стека строчку с наименованием завершенной задачи (using-параметр task);
4) чтобы дождаться выполнения всех задач - ставьте бесконечный цикл, с выходом по условию пустой таблицы-стека (когда таблица будет пустая - все задачи завершены).

Второй случай - удобен для отладки, чтобы понять какая задача ещё висит, а какие отработали.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Отслеживание завершения фона (Task)
СообщениеДобавлено: Пн, июл 28 2014, 19:13 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 29 2012, 16:47
Сообщения: 85
Для ожидания чего либо можно использовать таймер
[url]https ://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/6685[/url]

И возможно , стоит посмотреть в сторону механизма событий
se62 (3-я закладка)
вызвав программно событие вы стартуете фоновое задание , созданное заранее (программа, транзакция).
Но с событиями придется пересмотреть архитектуру вашего приложения.

1. Гуи старт всех потоков. Запись признака в шаред память.
2. программа Гуи ожидает по таймеру сброса признака.
3. Каждый поток выполняет свой код и в конце вызывает событие.
4. Фоновая программа вызываемая по событию - считает вызовы и когда придет последнее событие (по количеству например) выполняет Общий блок.
Затем сбрасывает признак в шаред памяти
5. Гуи программа прочитав признак - сообщит пользователю о результате работы...

как то так.

код вызова события
Code:
data btc_s_evt_param type BTC_S_EVT_PARAM.

       CALL METHOD cl_batch_event=>raise
        EXPORTING
          i_eventid                      = 'Z_NAME' " btc_s_evt_param-eventid
          i_eventparm                 = btc_s_evt_param-eventparm
          i_server                       = btc_s_evt_raise_local_disp-eventserver
        EXCEPTIONS
          excpt_raise_failed             = 1
          excpt_server_accepts_no_events = 2
          excpt_raise_forbidden          = 3
          excpt_unknown_event            = 4
          excpt_no_authority             = 5
          OTHERS                         = 6.
      btc_s_evt_raise_local_disp-sy_subrc = sy-subrc.
      CASE sy-subrc.
        WHEN 0.
          LEAVE TO SCREEN 0.
        WHEN 1.
          MESSAGE i249(bt) WITH btc_s_evt_param-eventid.
        WHEN 2.
          MESSAGE i702(bt) WITH btc_s_evt_raise_local_disp-eventserver.
        WHEN 3.
          MESSAGE i701(bt) WITH btc_s_evt_param-eventid.
        WHEN 4.
          MESSAGE i042(bt) WITH btc_s_evt_param-eventid.
        WHEN 5.
          MESSAGE i705(bt).
        WHEN OTHERS.
          MESSAGE i720(bt) WITH sy-subrc 'event_raise_gui'
         'user_command_6000'.                               "#EC NOTEXT
      ENDCASE.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Отслеживание завершения фона (Task)
СообщениеДобавлено: Вт, июл 29 2014, 04:53 
Специалист
Специалист

Зарегистрирован:
Вт, июн 10 2014, 09:41
Сообщения: 180
А ещё можно попробовать извратиться как-нибудь так (чтобы не делать вечные циклы или работать с событиями):
Code:
  DATA:
    gv_func1_end TYPE flag,
    gv_func2_end TYPE flag.

  CALL FUNCTION 'ZFUNC1' STARTING NEW TASK 'ZTASK1'
    DESTINATION 'NONE' PERFORMING zz_end_of_arfc ON END OF TASK.

  CALL FUNCTION 'ZFUNC1' STARTING NEW TASK 'ZTASK1'
    DESTINATION 'NONE' PERFORMING zz_end_of_arfc ON END OF TASK.

  WAIT UNTIL gv_func1_end = 'X'.
  WAIT UNTIL gv_func2_end = 'X'.

* Здесь пойдёт код после выполнения всех заданий

FORM zz_end_of_arfc USING iv_taskname TYPE clike.
  CASE iv_taskname.
    WHEN 'ZFUNC1'.
      gv_func1_end = 'X'.
    WHEN 'ZFUNC2'.
      gv_func2_end = 'X'.
  ENDCASE.
ENDFORM.

Вместо кучи gv_funcX_end лучше на внутренние таблички переделать с названием задания :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Отслеживание завершения фона (Task)  Тема решена
СообщениеДобавлено: Ср, июл 30 2014, 17:31 
Начинающий
Начинающий

Зарегистрирован:
Пт, мар 14 2014, 15:59
Сообщения: 10
Изначально было реализовано через физ.таблицу: перед запуском ФМ2, добавлял запись в физ.таблицу, в ФМ2 в конце запись удалял, а в ФМ1 в бесконечном цикле ждал, когда физ.таблица станет пустой, чтобы идти дальше.
Это уже был крайнее решение. Но, ой, как не нравилось, что SELECT в цикле

Теперь, реализовал!

Спасибо за помощь всем, особенно UKY. Его решение было взято за основу. Хотя таким способом я <я не знать русский языка> изначально, но почему-то не получалось. Единственное у UKY в FORM не было еще фичи receive results from function 'ФМ2', которая закрывает отработанный таск (само окошко, режим)

Если кому интересно:

Code:
..
do N times.
  move N to ntask.
  concatenate 'task' ntask into task.
  call function ФМ2 new task task
   performing return_data on end of task
enddo.
...

     wait until gitab_string is initial.

...

form return_data using task .

  case task.
    when task .
      delete gitab_string where table_line eq task.
      receive results from function 'ФМ2'
      importing
            xxx = xxx.

  endcase.

endform. 


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB