![]() |
![]() |
![]() |
|
Многопоточность и многозадачность в 1C | ☑ | ||
---|---|---|---|---|
0
Elisy
06.11.09
✎
08:40
|
http://www.richmedia.us/post/2009/11/02/1c-multithreading-and-callback-functions.aspx
Начиная с третьей версии Elisy .Net Bridge добавляет многопоточность во все популярные версии 1С:Предериятие. Конечно не родными командами 1С, а средствами .Net framework, но многопоточность - настоящая. Пример обработки к статье прилагается. Представленная здесь статья открывает новые горизонты в 1С-программировании. Например, решает проблему параллельной работы и получения большого числа писем встроенным клиентом 1С. Остаются еще вопросы, связанные с использованием методики, например: не затрещит ли по швам сама 1С от такой нагрузки? Одинаково ли будут вести себя все версии 1С 7.7/8.0/8.1/8.2, на которые рассчитан компонент .Net Bridge? Достаточно ли традиционных средств .Net framework для организации многозадачности или есть особенности использования пары 1С и .Net? На все эти вопросы со временем найдутся ответы. |
|||
1
Voffka
06.11.09
✎
08:45
|
ПиАр?
|
|||
2
Lama12
06.11.09
✎
08:49
|
(0)Не понял... а что мешает стандартными методами организовать многопоточность?
|
|||
3
Elisy
06.11.09
✎
09:04
|
(1)Да
|
|||
4
Pashkaa
06.11.09
✎
09:06
|
(2) Пример в студию
|
|||
5
Vitello
06.11.09
✎
09:06
|
(4)Через фоновые задания.
|
|||
6
Elisy
06.11.09
✎
09:06
|
(2)(5)Фоновых заданий нет в 1С 7.7. А фоновые задания из 8ки по-разному работают с файловым и клиент-серверным режимами работы.
|
|||
7
Lama12
06.11.09
✎
09:11
|
(5)+1,или просто запустить вторую сессию передав ей параметры и организовав взаимодействие (синхронизацию, передачу параметров и т.д.) через константы или любые другие объекты.
Вариант и для 7.7 подойдет. У меня по такому принципу работала загрузка сразу из нескольких баз в одну. Все запускалось с одной сессии. |
|||
8
Pashkaa
06.11.09
✎
09:11
|
(5) вот тебе и ответ в (6)
Попробуй как напиши обработку, прикрути туда фоновые задания, распараллель всё это и в итоге выведи на форму обработки какой нить результат например. Это будет таким извратом. |
|||
9
Pashkaa
06.11.09
✎
09:12
|
(7) Дак у многих так загрузка работает по OLE но это простите не многозадачность, когда ты запускаешь 5 сеансов что бы распараллелить обработку данных
|
|||
10
Lama12
06.11.09
✎
09:13
|
(9)Блин... а что мешает также обрабатывать данные?
|
|||
11
Kraft
06.11.09
✎
09:18
|
(0) автар, почитай, что такое многопоточность
|
|||
12
Холст
06.11.09
✎
09:28
|
вброс на вентилятор засчитан... а где пример работы на 1С 7.7 то?
|
|||
13
Pashkaa
06.11.09
✎
09:28
|
(11) wiki Многопото?чность — свойство платформы (например, операционной системы, JVM и т. д.) или приложения, состоящее в том, что процесс, порождённый в операционной системе, может состоять из нескольких потоков, выполняющихся «параллельно», то есть без предписанного порядка во времени. При выполнении некоторых задач такое разделение может достичь более эффективного использования ресурсов вычислительной машины.
|
|||
14
Pashkaa
06.11.09
✎
09:31
|
(10) Представь что для вывода отчета тебе надо выполнить 10 запросов и содрать воедино результат.
Теоретически сейчас бы ты делал это запустив 1 + 9 экземпляров платформы, выполнил бы запрос по OLE собрал бы в одном месте результат, закрыл бы остальные платформы и вывел бы результат. Я так понимаю (0) предполагает выполнение подобных задач параллельно в одной базе используя .Net |
|||
15
Elisy
06.11.09
✎
09:36
|
(14)Совершенно верно. В .Net 4.0, говорят, это еще проще будет сделать. Там появится динамический тип.
|
|||
16
Pashkaa
06.11.09
✎
09:41
|
(15) вот только бы пример более жизненный привести, а не таймер в обработке и то что при этом платформа не блокируется.
Например, запуск одновременно заполнения запроса и Процедуры Состояние("Прошло " + Строка(КоличествоСекунд) + "сек с момента запуска выполнения запроса"); где КоличествоСекунд увеличивается. Выполнялось бы параллельно два потока. |
|||
17
Elisy
06.11.09
✎
09:50
|
(16) Полностью согласен. Со временем появятся такие примеры, думаю.
|
|||
18
xReason
06.11.09
✎
12:17
|
(0) Компонента платная?
|
|||
19
luns
06.11.09
✎
12:28
|
(8) Пример: http://infostart.ru/public/16486/
|
|||
20
Злобный Фей
06.11.09
✎
12:29
|
Какой-то унылый пиар
|
|||
21
luns
06.11.09
✎
12:31
|
А вот здесь пример применения: http://infostart.ru/public/16782/
|
|||
22
Elisy
06.11.09
✎
12:35
|
(18)Для разработчиков бесплатная. Платная для конечных пользователей.
|
|||
23
Aswed
06.11.09
✎
12:40
|
А когда будет наконец работать многопоточность в обычной платформе?
Никто не слышал? |
|||
24
Злобный Фей
06.11.09
✎
12:41
|
(23) А что, обещали?
|
|||
25
golden-pack
06.11.09
✎
12:41
|
||||
26
trdm
06.11.09
✎
12:43
|
сайт какой-то аляповый.
не смотрел число из-за дизайна. В злазах мельтешит. |
|||
27
Elisy
06.11.09
✎
12:54
|
(25) Думаю, что нет
|
|||
28
golden-pack
06.11.09
✎
12:57
|
(27) Мне показаось что один пользователь отвечает на заранее подготовленные вопросы другого
|
|||
29
H A D G E H O G s
06.11.09
✎
13:07
|
(27) Мда -уж.
Ну и? Метод компоненты вызывает таймер, который в отдельном потоке дергает экспортную процедуру формы. Что такого сенсациального? |
|||
30
Vitello
06.11.09
✎
13:10
|
А мне вот интересно, синхронизированная запись\чтение переменных там поддерживается?
|
|||
31
Elisy
06.11.09
✎
13:15
|
(26) :) Выбери вариант оформления, мы тебе на ночь включим:
http://www.richmedia.us/?theme=angel http://www.richmedia.us/?theme=arthemia http://www.richmedia.us/?theme=BlogSmith http://www.richmedia.us/?theme=BrightSide |
|||
32
H A D G E H O G s
06.11.09
✎
13:18
|
Когда сможете получить дескрипторы элементов управления - тогда возвращайтесь.
Пока - лесом. З.Ы. Лучше уж вызывать не экспортную процедуру формы, а генерировать ВнешнееСобытие(). Там хоть буфер событий есть. Не пропадет :-) З.Ы.Ы. Чем ваша поделка отличается от ПодключитьОбработчикОжидания() ?? |
|||
33
Elisy
06.11.09
✎
13:19
|
(28)Просто, показалось. Pashkaa задавал нормальные закономерные вопросы. Надеюсь, что я на них ответил.
|
|||
34
szhukov
06.11.09
✎
13:21
|
(0) Это может пригодиться для какой-то очень специфической задачи, где
использование самой 1С может стоять под сомнением вообще. Собираю данные в 1С со стороннего оборудования On-line, использую фоновые задания - никаких проблем (полноценная многопоточность).(1С v8.1) Если эта компонента для 7-ки... тогда да, может быть и есть смысл. А так ИМХО бесполезная трата времени. |
|||
35
Elisy
06.11.09
✎
13:22
|
(30)Глубоко не исслкдовался вопрос. Предполагаю, что возможны несколько подходов. Какой лучше, нужно конкретно разбираться.
1. В сгенерированном C#-классе это может быть lock. Не обязательно на "ЭтаФорма" (ThisForm), а на другое свойство. 2. Новое свойство сгенерированного C#-класса или переменная 1С с типом System.Threading.AutoResetEvent/ManualResetEvent. В этом случае оно/она доступна и C#-классу и 1С коду для анализа. 3. Использование в 1С-коде вызовов: net.CallStatic("System.Threading.Monitor", "Enter", обработчик.ThisForm); //Какой-то код net.CallStatic("System.Threading.Monitor", "Exit", обработчик.ThisForm); 4. Вспомогательный объект .Net BackgroundWorker может быть полезным в большинстве сценариев. |
|||
36
fisher
06.11.09
✎
13:24
|
Какие новые горизонты?
Список реальных задач, плиз. Очень интересно. |
|||
37
H A D G E H O G s
06.11.09
✎
13:26
|
(35)
З.Ы.Ы. Чем ваша поделка отличается от ПодключитьОбработчикОжидания() ?? Тем, что пинок идет из внешней компоненты, а не из ОбработчикаОжидания. Ну и дискретность меньше секунды может быть. Так? |
|||
38
fisher
06.11.09
✎
13:27
|
(37) Обработчик ожидания в том же потоке отрабатывает.
|
|||
40
Pashkaa
06.11.09
✎
13:34
|
(37) разве можно запустить в одном сеансе обработчик и при его срабатывании делать что либо еще в 1С?! По-моему можно только пойти покурить пока выполняется тяжёлая задача при срабатывании обработчика.
(39) точно время надо потратить на доработку решения и на показ людям её полезности, а не так что я сделал такую штуку скачайте её. Пример с таймером крайне не удачный. У коллег сложилось мнение что его можно заменить обычным ОбработчикомОжидания. |
|||
41
Elisy
06.11.09
✎
13:36
|
(32)(37) Вообще-то таймер - это частный случай для простоты понимания принципа работы. Реальный эффект даст использование Thread и BackgroundWorker классов.
|
|||
42
Pashkaa
06.11.09
✎
13:39
|
(41) братан ни все специалисты по .NET говори языком 1С и приводи примеры на прикладных задачах 1С. Кто такие классы наверно многие учили, а вот что такое Thread и BackgroundWorker хрен его знает.
|
|||
43
fisher
06.11.09
✎
13:46
|
Во-во. Как раз примеров на прикладных задачах 1С и не хватает. Боюсь и не хватит. Сдаётся мне, что рынок для этого продукта настолько мал, что невооруженным глазом его сложно разглядеть.
|
|||
44
szhukov
06.11.09
✎
13:47
|
(40) Читайте (34) Работает реально задача фоново, никого не ждет, снимает данные и фоново формирует документы.
|
|||
45
H A D G E H O G s
06.11.09
✎
13:49
|
ТОварисчь.
Знаешь. Я скорее всего смогу свайять конфу, в которой все отчеты (пусть будут только отчеты) смогут выполняться параллельно. Без ФонововыхЗаданий. На файловом варианте. Но. Весь код будет зашит в ВК. Ибо никак. Если еще на выполнение запроса - мы просто можем тупо передать текст в ВК и параметры, то код обработки результата - надо писать в самой ВК. |
|||
46
H A D G E H O G s
06.11.09
✎
13:50
|
(45) Поэтому бесперспективняк.
|
|||
47
TheNewOne
06.11.09
✎
13:53
|
(0) идея, конечно, интересная.. но применения я лично не вижу.
1)7ка-то вообще работает с этим? или это все теоретически и не пробовалось? если 7ка не работает - то аргументов против фоновых заданий почти нет. 2)Многопоточноть получается вне 1С. Т.е. одновременно можно запустить несколько C# потоков, поток 1С останется одним. Какие есть сложные задачи.. ну вот авторасчет ширин колонок в здоровом табличном документа.. расчет себестоимости.. Сомневаюсь, что такие вещи можно паралелить в c# коде. 3)Распаралеливание выполнения запросов - это бред. я ни разу не видел, чтобы где-то выполнялось подряд несколько независимых запросов. Либо запросы используют результат друг друга, либо это один большой запрос. 4)Если уж писать на сях, то почему бы не сделать внешнюю компоненту и уж там многопоточить сколько хочешь. Callback?. сто лет назад уже в окно 1С сочетание клавиш посылал. 5)Код с таймером конечно неудачный, но боюсь другого не придумать. 6)Чтобы за это еще кто-то платил.. Если бы мне платили за использование этого продукта, я бы еще подумал. |
|||
48
H A D G E H O G s
06.11.09
✎
13:54
|
(47) <<Callback?. сто лет назад уже в окно 1С сочетание клавиш посылал. >>
Мдааа |
|||
49
H A D G E H O G s
06.11.09
✎
13:54
|
Прикольный call-back
|
|||
50
Pashkaa
06.11.09
✎
13:56
|
(44) я скачал глянуть еще не успел. Реализация там может и изящная, но вот там как я понимаю распараллелили два потока, рабочий сеанс и + один фоновый где так же может выполняться лишь одна фоновая задача. Это не выход из ситуации. А если пользователю надо не 2 отчета сформировать разом а пачку.
Как выход из ряда ситуаций согласен подойдет решение (34). Но просится поддержка многопоточности и многоядерности самой платформой в пользовательском режиме. |
|||
51
Elisy
06.11.09
✎
13:56
|
(36) В программировании считается хорошим тоном открывать второй поток для задач, выполняющихся более 3х секунд, чтобы интерфейс пользователя откликался. Много таких задач в 1С?
|
|||
52
H A D G E H O G s
06.11.09
✎
13:58
|
(51) Вон оно че!
Пользователь не переживет непрорисованного окна? |
|||
53
Pashkaa
06.11.09
✎
13:58
|
Задач много.
Пример покажи более жизненный. Возьми любой типовой отчет, сохрани его во внешнюю обработку, пределай с использованием твоих наработок и скажи нам в какой типовой конфе его запустить, что бы при этом интерфейс пользователя оставался полностью ему доступен для работы с другими задачами |
|||
54
Elisy
06.11.09
✎
13:59
|
(39) Я бы тоже так подумал, если бы компонент предыдущих версий более 200 раз не скачали. В другие направления силы вкладываются тоже.
|
|||
55
Pashkaa
06.11.09
✎
14:00
|
вдогонку к (53) при этом что бы не было ни каких фоновых процессов 1с кроме единственного запущенного.
|
|||
56
RealSaint
06.11.09
✎
14:06
|
(0) Я мало-мало не понял, на сайте нужно регистрироваться, чтобы скачать компоненту?
|
|||
57
Elisy
06.11.09
✎
14:07
|
(47) Компонент создавался для подключения .Net framework к 1С. Многопоточность - это частный случай его применения дополнительно к шифрованию информации, работе с графикой, регулярным выражениям и т.д. То, что он предлагает принципиально новый подход к многозадачности - однозначно. Приживется или нет - покажет время.
|
|||
58
Elisy
06.11.09
✎
14:10
|
(53)(55) Спасибо. Изучу отзывы здесь и на инфостарте, переделаю пример под реальные требования.
|
|||
59
H A D G E H O G s
06.11.09
✎
14:11
|
(57) <<работе с графикой>>
Ето как? |
|||
60
Elisy
06.11.09
✎
14:13
|
(56) Да, нужно регистрация на форуме http://www.1centerprise.com/forums/. Это тестовая версия, которая выложена не для широкого применения. Предыдущие релизы можно скачать свободно, например, на Инфостарте.
|
|||
61
Elisy
06.11.09
✎
14:16
|
(59) Вот так:
AttachAddIn("AddIn.ElisyNetBridge"); AddIn = New("AddIn.ElisyNetBridge"); net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge"); //Код показывает, как нарисовать простое изображение и записать его в файл drawing = net.LoadAssembly("System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); buffer = net.New("System.Drawing.Bitmap", 350, 350); bufferSurface = net.CallStatic("System.Drawing.Graphics", "FromImage", buffer); yellowBrush = net.New("System.Drawing.SolidBrush", net.New("System.Drawing.Color").Yellow); bufferSurface.FillEllipse(yellowBrush, 25, 25, 187, 187); blackBrush = net.New("System.Drawing.SolidBrush", net.New("System.Drawing.Color").Black); bufferSurface.FillEllipse(blackBrush, 70, 75, 22, 17); bufferSurface.FillEllipse(blackBrush, 140, 75, 22, 17); blackPen = net.New("System.Drawing.Pen", net.New("System.Drawing.Color").Black, 10); bufferSurface.DrawArc(blackPen, 65, 95, 102, 75, 0, 180); buffer.Save("d:\Smile.jpg"); |
|||
62
Rebelx
06.11.09
✎
14:19
|
а как насчет выполнения запросов в несколько потоков? а в транзакции?
|
|||
63
H A D G E H O G s
06.11.09
✎
14:20
|
(61) Знаешь, когда я писал Нетленку - я думал - сделаю так-же.
Тупо дам конструктор из WinAPI и пусть творят. Потом подумал и сказал - нет, не стоит. Знаешь, почему? А потому, что товарисчь, способный осилить (61) достаточно легко осилит и написание ВК для 1С. |
|||
64
luns
06.11.09
✎
14:47
|
(63) +
Нам бы попроще... типа: НарисоватьКрасиво(Что,Где,Цвет = Сиреневенький) |
|||
65
TheNewOne
06.11.09
✎
14:50
|
(57) тогда наверное и надо вести в этом ключе тему, типа "хотите писать на шарпе прямо из 1С? а вот вам тогда:..". а то "многопоточность"..
И тогда еще надо придумать, зачем писать на шарпе именно из 1С. Мне это опять же в голову не лезет - в студии на шарпе писать удобнее, если уж приперло. (48)(49) прикольный, ага. в 2001 году дело было. |
|||
66
Elisy
07.11.09
✎
07:30
|
(63) У всех разные подходы. Код (61) попадает под родные 1С механизмы: обновление конфигураций, сравнение модулей, значения объектов видятся отладчиком и на каждую строку кода можно поставить точку останова.
Отладка ВК происходит намного тяжелее и дольше. ВК не несет в себе гибкости, а пользователи ВК полностью зависят от разработчика ВК. На каждую задачу требуется своя ВК. |
|||
67
Elisy
07.11.09
✎
07:41
|
(64) Такие ВК уже написаны. У нас другой подход - дать максимально возможную функциональность .Net framework. Тогда получится следующее: например, XAML или Json еще в других ВК обработках не освоили, а наши пользователи могут передовыми технологиями пользоваться уже в текущей версии .Net bridge. А таких применений огромная масса.
(65)Обсуждения в таком ключе велись уже, например: Добавление поддержки .Net к 1С:Предприятие Сейчас планы: дать практические примеры использования ВК .Net Bridge. А их даже для текущего релиза можно придумать массу, было бы время. |
|||
68
ShoGUN
07.11.09
✎
08:12
|
(67) Почему аккаунт на форуме требует подтверждения регистрации админом? О_о Только что зарегистрировался, а скачать не могу... Сделайте нормальную регистрацию!
|
|||
69
Elisy
07.11.09
✎
08:26
|
(68)Потому что 2 дня идет огромный поток спама на форум. Ваша регистрация подтверждена.
|
|||
70
ShoGUN
07.11.09
✎
08:29
|
(69) Ясно. Спасибо.
|
|||
71
Elisy
10.11.09
✎
12:13
|
Кому интересна тема - выложил здесь (http://infostart.ru/public/download.php?file=60484) пример отчета "Анализ цен" из УТ 10.3, построенного на классе BackgroundWorker. Пока не понятно, почему при его работе блокируется интерфейс пользователя 1С. Хотя в отличие от оригинального "Анализа цен" оконные сообщения Windows накапливаются и обрабатываются после формирования отчета.
|
|||
72
Elisy
10.11.09
✎
12:16
|
Пока такое поведение можно объяснить высказываниями (38)(45)(47)
|
|||
73
Demiurg
10.11.09
✎
16:13
|
при все уважении, лучше бы ты выложил все тоже самое, но сделанное на фоновых процессах 1С,
ато новички на тебя будут смотреть и думать что это правильно |
|||
74
Elisy
17.11.09
✎
06:24
|
(73) Спасибо за уважение, мне не интересно делать то, что описали до меня. Фоновые процессы 1С для новичков описаны уже, например, на: Книга знаний: v8: Асинхронные вычисления без «заморозки» формы (на фоновых заданиях)
|
|||
75
Elisy
18.11.09
✎
06:47
|
Еще к теме: пример рабочей обработки асинхронного вызова веб-сервисов в 1С 8.1
http://www.richmedia.us/file.axd?file=2009%2f11%2fAsynchronousWebServices.epf |
|||
77
v77
18.11.09
✎
09:05
|
А почему в списке топиков показывает 76 сообщений, а когда заходишь, то 75?
|
|||
78
hhhh
18.11.09
✎
09:19
|
(77) какого-то бедолагу забанили
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |