Имя: Пароль:
1C
 
аналог lock в 1С
0 Кукурузина
 
06.01.17
15:04
Если взять за пример другой язык программирования в них существуют различные инструменты для синхронизации потоков, например lock{} (в C#) т.е. обернув какой-то участок кода в lock мы будем уверены, что этот код будет выполнен последовательно. Вот нужно так же в 1С сделать )) т.е. что бы конкретная процедура выполнялась последовательно.

Пример:
запуск в фоне процедура1

процедура1 - ветвится:
процедура1
   вызов процедура2
   вызов процедура3
      вызов процедура5
         вызов процедура7 - и вот только 7-ю нужно выполнять последовательно, что бы ФЗ ожидали выполнение этой процедуры другим ФЗ
      вызов процедура6
   вызов процедура4
1 vde69
 
06.01.17
15:09
в 1с, в рамках одного фонового задания отсутствуют потоки и параллелизм....

чего конкретно тебе надо?
2 Неверный Параметр И
 
06.01.17
15:09
3 Кукурузина
 
06.01.17
15:10
(1) а кто говорил про одно?
4 Кукурузина
 
06.01.17
15:11
(2) это блокировки БД, причем тут они?
5 vde69
 
06.01.17
15:12
(3) ты хочешь все процедуры из (0) запускать в разных фоновых заданиях?
6 Кукурузина
 
06.01.17
15:14
(5) какие все? запускается только одна процедура1, но она вызывает другие процедуры и функции, которые в свою очередь тоже что-то вызывают и да, процедура1 будет выполняться в параллельно (в нескольких ФЗ)
7 NorthWind
 
06.01.17
15:18
(6) думается мне, вы от эски многого хотите. Полноценную многопоточность с критическими секциями, семафорами и т.д. она не умеет пока.
8 Кукурузина
 
06.01.17
15:19
(7) ясно, буду искать пути решения
9 vde69
 
06.01.17
15:20
(6) то есть алгоритм такой

1. вызываем несколько фоновых заданий, в каждом из которых выполняется "процедура1" которая может вызывать строго последовательно другие функции но не запускает другие фоновые задания
2. когда все фоновые задания закончились - вызываем "процедура7" с мараметрами получеными из предыдущих фоновых заданий

я все правильно расписал?
10 vde69
 
06.01.17
15:21
(7) Вы зря так категоричны... я делал и семофоры и паралеьные данные....

давайте для начала поймем чего автору надо
11 Кукурузина
 
06.01.17
15:23
(9) нет
(10) чего мне надо я написал, ты работал с многопоточностью в других языках, знаешь что такое критические секции? Вот их аналог нужно реализовать.
12 NorthWind
 
06.01.17
15:25
(9) ему критическую секцию надо. Т.е. ему нужно где-то в недрах фонового задания выполнить кусок кода, который будет выполняться до конца, а задания должны перекуривать до тех пор пока он не закончится. И потом они должны продолжиться.
13 vde69
 
06.01.17
15:29
(11) есть много вариантов,

1. например сделать семофор через блокировку предопределенного элемента справочника и ожидание остальными снятия блокировки. (но тут проблемы с паузой, и загрузкой ЦП)

2. сделать управление через один главный поток (который будет все синхронизировать), тут будет медленно...

3. можно через внешний COM обьект (но его писать надо)


я так до конца и не понял чего надо автору...
14 NorthWind
 
06.01.17
15:30
даже правильнее так: в недрах *одного из* фоновых заданий выполнить некий кусок кода, тогда как *остальные* задания должны остановиться и ждать пока выполнится. Затем эти остановленные задания должны продолжить работу с того места где остановились. Не, мне кажется, нормально на 1С это не сделать. Во всяком случае не знаю как.
15 vde69
 
06.01.17
15:31
(12) а, ему нужно остановить все другие рег задания пока не продет одно... тогда блокировка предопределенного элемента...
16 NorthWind
 
06.01.17
15:36
(15) ну да. Когда я писал, что не умеет, я имел в виду отсутствие средств языка или библиотек. Сгородить можно, но придется велосипедить, и не факт что получится хорошо.
17 Неверный Параметр И
 
06.01.17
15:39
(4) При том, что блокировка и ожидание ресурсов, которым являются твои критические секции, в 1с делаются через общие объекты в базе данных.
Можешь, конечно изобретать квадратные трехколесные, зато свои.
18 vde69
 
06.01.17
15:42
(16) из специальных средств управления фоновыми заданиями есть только самый минимум, это сообщение из фона в вызвавшую сессию и пожалуй все...

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

и исходить нужно именно из этого
19 Garykom
 
гуру
06.01.17
16:31
(0) Тока не говори что в королевстве кривых зеркал задумали многопоточность с честной асинхронностью делать
20 H A D G E H O G s
 
06.01.17
16:37
В 1С нет и не будет всех этих мьютексов. По причине:
1) Кластерности сервера 1С.
2) отсутствия обратного вызова сервер>клиент
21 H A D G E H O G s
 
06.01.17
16:37
Делать критические секции на объектах БД - верх жести.
22 Garykom
 
гуру
06.01.17
17:10
(20) 1. Пофиг на кластерность сервера 1С, ибо многозадачности будут отдельные для клиента и сервера и для сервера тока в одном потоке "субпотоки"
2. Уже сделали же, точнее нечто вроде
23 Кукурузина
 
06.01.17
17:17
(17) facepalm
24 Кукурузина
 
06.01.17
17:29
(20) причины не ахти, разрабатывают же клиент серверные приложения на языках поддерживающих все прелести многопоточности
25 Cool_Profi
 
06.01.17
17:35
(24) Зачем в бухгалтерии многопоточность?
26 Кукурузина
 
06.01.17
17:42
(25) почему обязательно бухгалтерия? Может у меня загрузка чего-то в БД происходит, логично ж делать загрузку параллельно
27 Cool_Profi
 
06.01.17
17:45
(26) Для этого вполне достаточно имеющихся средств
28 H A D G E H O G s
 
06.01.17
17:50
(24) Всё опять упирается в сериализацию 1С, вернее в быстродействие.
29 DmitrO
 
06.01.17
17:58
(0)для этого есть только метод ОжидатьЗавершения у задания, и у МенеджераФоновыхЗаданий.
30 DmitrO
 
06.01.17
18:02
И да, не будет работать в файловом режиме, и в мобильной платформе. В этих режимах у 1С только одно фоновое задание (чистый идиотизм).
31 trdm
 
06.01.17
18:05
(10) > Вы зря так категоричны... я делал и семофоры и паралеьные данные....

Не особо  типичная задача для учетной системы.
32 Кукурузина
 
06.01.17
18:13
(29) аааааа.... ну не позорьте вы профессию программиста!!!
33 DmitrO
 
06.01.17
18:17
(32)Это точно мне? :) Чем же я запятнал ее, сударь? Я подсказал вам способ решения вашей задачи.
34 vde69
 
06.01.17
18:57
(31) я делал анализатор сети (в рамках 1с), там мне нужно было выполнять много сетевых операций с таймаутом, и я это делал в много потоков.

да к учету это не сильно относится, это скорее tools для 1с...
35 trdm
 
06.01.17
19:02
(34) А вот аналог аськи или скайпа в 1С - это одна из нужных на мой взгляд вещей.
36 vde69
 
06.01.17
19:04
(35) уже реализована на уровне платформы :) недавно было в зазеркалье
37 Torquader
 
06.01.17
19:19
Сдались вам мутексы и прочее.
Выносите код,который должен исполняться в один поток,в отдельное фоновое задание,чтобы тот,кому он нужен,запускали это задание и ждали его завершения - уж фоновое то несколько раз не запустить.
А через базу не очень хорошо,так как в транзакциях можно что-то не то залочить - точнее, вы блокируете объект и начинаете что-то делать, открываете транзакцию - снимаете блокировку с объекта, но, если вы в нём что-то поменяли, то он будет заблокирован для чтения до окончания транзакции - и ой.
38 Serginio1
 
06.01.17
19:27
(35) Бери 1C Messenger для отправки сообщений, файлов и обмена данными между пользователям
Можешь написать свой
(36) Там самому то написать несложно. Непонятно, почему они так долго тянули.