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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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