Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Выполнить длительную процедуру в асинхронном режиме (число прочтений - 2853 )
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Выполнить длительную процедуру в асинхронном режиме
12. Декабря 2018 :: 18:36
Печать  
Здравствуйте!

В модуле формы создается объект класса "Т_ОбработкаДокументов".
Пользователь нажимает кнопку и вызывается метод этого объекта, который в цикле выполняет долгую работу с документами:
оОбработкаДокументов.Выполнить(Параметры);

Нужно сделать, чтобы пользователь при этом не "подвисал" надолго.
То есть, чтобы эта процедура отработала в "асинхронном" режиме.

Для этого можно сделать что-то типа "ОбработкиОжидания" и при каждом вызове назначенной процедуры обрабатывать например один шаг цикла.

Вопрос в том, что на "ОбработкуОжидания" назначается глобальная процедура, а было бы удобней, если назначить "локальную" процедуру объекта класса.

Можно ли так сделать?

Может быть есть какие-то другие, более удобные способы организации "асинхронного" выполнения процедуры?
  
Наверх
ICQ  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1537
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выполнить длительную процедуру в асинхронном режиме
Ответ #1 - 13. Декабря 2018 :: 09:00
Печать  
Можно использовать объект "Таймер" из FormEx.
Но лучше, наверное, сделать что-то типа превдосервера - запустить отдельно сеанс под служебным пользователем и слать ему задания. Он будет выполнять долгую процедуру и выкидывать в хранилище результат.
  

FormEx developer
Наверх
www  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Выполнить длительную процедуру в асинхронном режиме
Ответ #2 - 13. Декабря 2018 :: 11:07
Печать  
АЛьФ писал(а) 13. Декабря 2018 :: 09:00:
Но лучше, наверное, сделать что-то типа превдосервера - запустить отдельно сеанс под служебным пользователем

В принципе хорошая идея.

АЛьФ писал(а) 13. Декабря 2018 :: 09:00:
и слать ему задания.

Каким образом можно серверу слать задания?
Нужно же еще и параметры передавать.
Как это передать в "служебный" сеанс?

АЛьФ писал(а) 13. Декабря 2018 :: 09:00:
Он будет выполнять долгую процедуру и выкидывать в хранилище результат.

И тот же вопрос про результаты.
Как их лучше передавать с сервера на клиента?

  
Наверх
ICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Выполнить длительную процедуру в асинхронном режиме
Ответ #3 - 13. Декабря 2018 :: 11:13
Печать  
Самая простая схема - банальная очередь заданий.
1. Заводим табличку (справочник например)  с безразмерным текстовым полем
2. Параметры заданий сериализуем в строку, да хоть бы и ЗначениеВСтрокуВнутр(), и пишем в табличку
3. Сервер читает табличку, исполняет задание, и удаляет его из очереди

Если нужен какой-то отчет по результатам исполнения, то делаем ещё одну табличку, и туда складываем результаты.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Выполнить длительную процедуру в асинхронном режиме
Ответ #4 - 13. Декабря 2018 :: 13:27
Печать  
В общем понятно, спасибо.

ADirks писал(а) 13. Декабря 2018 :: 11:13:
3. Сервер читает табличку, исполняет задание, и удаляет его из очереди


А если, кроме конечного результата, в клиенте хочется знать и отслеживать ход выполнения этого процесса?
Как передавать промежуточные результаты?

Также через табличку?

Другой какой-нибудь есть способ?
  
Наверх
ICQ  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1537
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выполнить длительную процедуру в асинхронном режиме
Ответ #5 - 13. Декабря 2018 :: 13:33
Печать  
es3000 писал(а) 13. Декабря 2018 :: 13:27:
В общем понятно, спасибо.

ADirks писал(а) 13. Декабря 2018 :: 11:13:
3. Сервер читает табличку, исполняет задание, и удаляет его из очереди


А если, кроме конечного результата, в клиенте хочется знать и отслеживать ход выполнения этого процесса?
Как передавать промежуточные результаты?

Также через табличку?

Другой какой-нибудь есть способ?


Варианта передачи данных между двумя сеансами только два:
1. Через базу 1С
+ можно работать с объектами базы 1С напрямую
- лишние данные в базе
2. Через некое внешнее хранилище
+ не грузит основную базу
+ широкое поле в выборе типа хранилища (от файла до базы SQL)
- нельзя напрямую передавать внутренние объекты базы 1С

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

FormEx developer
Наверх
www  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Выполнить длительную процедуру в асинхронном режиме
Ответ #6 - 13. Декабря 2018 :: 13:57
Печать  
АЛьФ писал(а) 13. Декабря 2018 :: 13:33:
Варианта передачи данных между двумя сеансами только два:
1. Через базу 1С...
2. Через некое внешнее хранилище...


А если и клиент и псевдосервер работают на одном ПК: например, пользователь в сессии RDP запустил 1С и псевдосервер-1С также работает на этой же машине.
То чисто теоретически клиент может считать эти данные напрямую из памяти процесса псевдосервера.

Через COM, или как-то еще.
Разве нет?

  
Наверх
ICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Выполнить длительную процедуру в асинхронном режиме
Ответ #7 - 14. Декабря 2018 :: 05:20
Печать  
es3000 писал(а) 13. Декабря 2018 :: 13:57:
АЛьФ писал(а) 13. Декабря 2018 :: 13:33:
Варианта передачи данных между двумя сеансами только два:
1. Через базу 1С...
2. Через некое внешнее хранилище...


А если и клиент и псевдосервер работают на одном ПК: например, пользователь в сессии RDP запустил 1С и псевдосервер-1С также работает на этой же машине.
То чисто теоретически клиент может считать эти данные напрямую из памяти процесса псевдосервера.

Через COM, или как-то еще.
Разве нет?

В асинхронный, по сути своей, процесс не стоит запихивать синхронную технологию. Неизбежна потеря информации, и непонятные глюки.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Выполнить длительную процедуру в асинхронном режиме
Ответ #8 - 14. Декабря 2018 :: 17:36
Печать  
ADirks писал(а) 14. Декабря 2018 :: 05:20:
В асинхронный, по сути своей, процесс не стоит запихивать синхронную технологию.

А что тут синхронного?
Создать в серверном процессе ТЗ, длительный процесс выполняется и пишет в эту ТЗ промежуточные результаты, клиент через какой-нибудь механизм "смотрит" данные в этой ТЗ.

Вроде ничего не должно потеряться.

Есть такой механизм в 1С или 1С++, который позволяет "прочитать" переменные другого процесса? Или передать их значения из одного процесса в другой?

  
Наверх
ICQ  
IP записан
 
Logan
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 9
Зарегистрирован: 21. Апреля 2018
Пол: Мужской
Re: Выполнить длительную процедуру в асинхронном режиме
Ответ #9 - 28. Января 2019 :: 19:37
Печать  
Я практиковал использование браузера и js. Передаешь в браузер сериализованный объект из 1с и работаешь с ним из браузера. Можно хоть контекст туда закинуть... Все исполняет браузер дергая при этом объекты 1с... Магия Ужас Круглые глаза
Вот тема и пример фонового отчета:
http://www.1cpp.ru/forum/YaBB.pl?num=1316457428/2#2
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Выполнить длительную процедуру в асинхронном режиме
Ответ #10 - 21. Марта 2019 :: 16:15
Печать  
Logan писал(а) 28. Января 2019 :: 19:37:
Я практиковал использование браузера и js.
...
Вот тема и пример фонового отчета:
http://www.1cpp.ru/forum/YaBB.pl?num=1316457428/2#2

Спасибо!
Попробую так сделать.
  
Наверх
ICQ  
IP записан
 
MrDen
Junior Member
**
Отсутствует



Сообщений: 50
Местоположение: Краснодар
Зарегистрирован: 19. Ноября 2008
Пол: Мужской
Re: Выполнить длительную процедуру в асинхронном режиме
Ответ #11 - 03. Апреля 2019 :: 22:56
Печать  
es3000 писал(а) 21. Марта 2019 :: 16:15:
Logan писал(а) 28. Января 2019 :: 19:37:
Я практиковал использование браузера и js.
...
Вот тема и пример фонового отчета:
http://www.1cpp.ru/forum/YaBB.pl?num=1316457428/2#2

Спасибо!
Попробую так сделать.


Доброго дня!
Для автоматизации задач пользуюсь вот этим
https://infostart.ru/public/15995/
Асинхронно работает командная строка. Все остальное работает через Таймеры FormEx.
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Выполнить длительную процедуру в асинхронном режиме
Ответ #12 - 15. Июня 2019 :: 20:21
Печать  
АЛьФ писал(а) 13. Декабря 2018 :: 09:00:
Можно использовать объект "Таймер" из FormEx.


MrDen писал(а) 03. Апреля 2019 :: 22:56:
Асинхронно работает командная строка. Все остальное работает через Таймеры FormEx.


А как использовать Таймеры для асинхронных задач?


  
Наверх
ICQ  
IP записан
 
MrDen
Junior Member
**
Отсутствует



Сообщений: 50
Местоположение: Краснодар
Зарегистрирован: 19. Ноября 2008
Пол: Мужской
Re: Выполнить длительную процедуру в асинхронном режиме
Ответ #13 - 08. Августа 2019 :: 14:00
Печать  
es3000 писал(а) 15. Июня 2019 :: 20:21:
АЛьФ писал(а) 13. Декабря 2018 :: 09:00:
Можно использовать объект "Таймер" из FormEx.


MrDen писал(а) 03. Апреля 2019 :: 22:56:
Асинхронно работает командная строка. Все остальное работает через Таймеры FormEx.


А как использовать Таймеры для асинхронных задач?




Короткие по времени и не использующие в своей работе запросы задачи работают прекрасно при использовании таймеров - ОбработкаСобытия, каждое задание можно вешать на свой таймер. Кроме этого можно в обработке события компилировать код и запускать его. Можно использовать потоки для работы. Они не стабильны на некоторых (многих) функциях и процедурах, но самое главное выделение и контроль памяти при их работе. Такая компонента как VTool поддерживает многопоточночность. В ранних версиях 1cpp также была реализована данная возможность, но впоследствии от нее отказались.
Я очень много экспериментировал с потоками и таймерами. И также отказался от потоков. Но все зависит от асинхронных задач. Их необходимости и тп.
Ведь можно запускать несколько копий 1С - это очень похоже на мультизадачность.

Вот примеры как это выглядит в 1С Планировщике
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать