Имя: Пароль:
1C
 
Как получить прогресс выполнения фонового задания в несколько потоков?
,
0 Бешеный заяц
 
06.11.20
09:32
Собираюст массово грузить данные. планирую делать в несколько потоков,
Как в цикле запустить фоновые задания передав туда пареметры знаю, а вот как выводить текущее состояние (процент выполнения о каждом из них?) насколько помню в БСП можно выводить прогресс только по одному фоновому заданию так как параметром ожиданием является сам объект (форма)?
Уже думаю чтобы каждый поток генерировал свою HTML и писал текущее состояние... но это думаю не кошерно
1 mistеr
 
06.11.20
09:35
Каждое задание пишет свой прогресс куда-нибудь в общедоступное место, например в РС, или в справочник типа СохраненныеНастройки.
Ты читаешь и вычисляешь общий прогресс.
2 Dzenn
 
гуру
06.11.20
09:36
(1) присоединяюсь к идее. Просто выкидывай данные о прогрессе в общедоступное место, типа регистра сведений, например
3 Бешеный заяц
 
06.11.20
09:44
(1) (2) это конечно вариант, но боюсь запись отнимает время, котя как вариант писать не все подряд а раз в 50 отераций цикла
4 mistеr
 
06.11.20
10:15
(3) Конечно, только так. Даже не 50, а 100 или 1000, эквивалент нескольких секунд по времени.
Точность тут не нужна.
5 H A D G E H O G s
 
06.11.20
10:40
Через ВременноеХранилище и подключенный обработчик ожидания
6 Вафель
 
06.11.20
11:00
передавай не просто процент, а процент и номер потока
номер потока принимай как параметр самого потока
7 Вафель
 
06.11.20
11:00
то бишь придется руками повторить тот код бсп.
но он не сложный
сообщить - получить сообщения
8 fisher
 
06.11.20
11:25
(7) +1
БСП не использует лишние сущности. Фоновые просто выводят обычные сообщения, которые накапливаются в буфере вывода (т.к. их некому показывать), но которые можно вычитывать из основного потока. В принципе, через этот механизм можно реализовать асинхронное чтение почти любых данных из фонового задания.
9 Вафель
 
06.11.20
11:28
(8) это офф. механизм общения между потоками.
Единственное, что сообщения доставляются негарантированно
10 fisher
 
06.11.20
13:13
(9) "Офф." - в смысле, официальный? :)
Я бы сказал, что это случайная фича, просто пришедшаяся ко двору. И "узаконенная" фактом применения в типовых.
На человеческий механизм общения между потоками, особенно с учетом фичи негарантированной доставки, это даже в третьем приближении не тянет.
11 H A D G E H O G s
 
06.11.20
13:19
(10) Это жертвы мертворожденного кластера 1С.
12 Вафель
 
06.11.20
13:20
(10) ну раз в БСП применяют - значит официальный
13 fisher
 
06.11.20
13:45
(12) Значит когда выпилят - станет неофициальный.
14 fisher
 
06.11.20
13:49
(5) "Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания"
15 ДенисЧ
 
06.11.20
13:51
(10) официальная тоже есть. Правда, за отдельные деньги.
16 fisher
 
06.11.20
13:58
(15) Вот не начинай. Закрыть острую потребность в банальных серверных пушах через свистопердельный звездолет с постгрями и хезелкастами, где это составляет 0.01% возможностей - это издевательство над разработчиками.
17 ДенисЧ
 
06.11.20
14:01
(16) Вроде они как-то оправдывались несделанием обратного вызова... Правда, не помню, чем...
18 fisher
 
06.11.20
14:02
(17) Не, я могу придумать оправдания в том смысле, что это действительно не совсем тривиальная задача для общего случая. Но ответ Чемберлена все равно убивает.
19 ДенисЧ
 
06.11.20
14:19
(18) Не знаю, что там говорил лорд Невилл по поводу 1с.. (
Неграмотен
20 NWsFF
 
06.11.20
14:23
(0) "Не нужна вам такая машина пацаны" (С) Бумер 2
Но добавлю извращенных вариантов, используй "систему взаимодействия"
21 fisher
 
06.11.20
14:23
"Чемберлену"
"наш ответ Чемберлену"
22 stopa85
 
06.11.20
14:25
Есть ещё вариант.

Нужно загрузить 1000000 файлов.
Запускаешь 20 потоков, каждый грузит по 1000файло. Ожидаешь завершения потоков (одновременно все не завершатся). Один завершился, запускаешь ещё один, уведомляешь  % выполнения т.д.

Схема более совершенна (например можно регулировать количество потоков динамически, ничего никуда писать не нужно. Если словил деадлок можно перезапустить загрузку автоматом и т.д.) но сильно сложнее в реализации.