Имя: Пароль:
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) Там самому то написать несложно. Непонятно, почему они так долго тянули.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн