Вход | Регистрация

1С:Предприятие ::

Метки: 

ДобавитьОбработчик для ComОбъекта - особенности использования

Я
   Сниф
 
27.11.17 - 23:54
ДобавитьОбработчик SmartCOM.AddTick, SmartCOM_AddTick;

Процедура SmartCOM_AddTick( symbol, datetime, price, volume, tradeno,  action)
// Вот тут - синхронный вызов функций 1С или через Новый ОписаниеОповещения?



КонецПроцедуры
 
  Рекламное место пустует
   Сниф
 
1 - 27.11.17 - 23:56
Собственно вопрос - внутри обработчика COM-объекта вызывать функции 1С можно синхронно или через Новый ОписаниеОповещения? Куда "деваются события" если они приходят из com-объекта, а внутри обработчик еще занят? Встают в очередь ?
   Сниф
 
2 - 28.11.17 - 11:59
Вопрос еще актуален
   Torquader
 
3 - 28.11.17 - 12:08
Начнём с того, что есть два вида объектов: InProcess и OutProcess. Первые работают в адресном пространстве самого процесса, а их функции живут в подключаемой dll.
Соответственно, внутрипроцессорные объекты вызывают все функции напрямую, то есть вызов функции 1С, заявленной как обработчик произойдёт через интерфейс Dispatch по имени функции, указанной как обработчик события. Если это будет выполнять процедура обработки события (например, завершение чтения с диска), то они выполняются в том же потоке, что и сама 1С, и вызов сможет произойти, когда 1С ничего не делает, и всё будет безопасно.
Если же объект создаёт отдельный поток, то его вызов будет транслироваться через очередь сообщений как и для внешнего объекта.
Для внешнего объекта, вызов обработчика события происходит через очередь сообщений Windows, когда посылается сообщение от одного процесса (потока) другому. Пославший сообщение поток останавливается и ждёт ответа (там также применяется Timeout, если его превысить будет выдана ошибка). Да, есть возможность ответить вызвавшему процессу, что можно получить ответ через функцию ReplyMessage, но подсистема взаимодействия объектов этого не делает.
Поэтому, обработчик будет вызван только тогда, когда процесс 1С свободен и читает что-то из очереди сообщений.
Если 1С что-то будет долго выполнять (даже если мы вернём ответ при окончании события и вызовем обработчик оповещения или ожидания), то другое событие нам не поступит, так как будет занята очередь сообщений.
И, надо быть очень аккуратным, например, ОбработкаПрерыванияПользователя читает очередь сообщений, что может привести к выполнению кода в процессе выполнения другого кода, что иногда приводит к аварийному падению 1С.
   Сниф
 
4 - 28.11.17 - 12:16
(3) Благодарю!
   Torquader
 
5 - 28.11.17 - 12:24
Очередь событий, кстати, была у внешней компоненты, там можно было послать событие и продолжить работу компоненты, а 1С обрабатывала это событие, когда была готова.
   Сниф
 
6 - 28.11.17 - 12:28
(5) А как узнать, создает com-объект отдельный поток или нет? В процессах Win 10 ничего нового не появляется. Это говорит о том, что это внутрипроцессорный объект?
   Torquader
 
7 - 28.11.17 - 12:33
(6) Если объект живёт в dll, то он будет монтироваться в адресное пространство 1С. Отдельный поток ему будет нужен, если он выполняет какие-то действия параллельно с работой 1С, то точно поток есть.
Если он обменивается с оборудованием и т.п., то, скорей всего, без отдельного потока обошлись.

P.S. Что за объект ? Может быть, можно взять что-то другое ?
   Сниф
 
8 - 28.11.17 - 12:47
(7) Объект предоставляется брокером и предназначен для оперативного отслеживания биржевых котировок. Изучаю на практике биржевую торговлю и делаю себе систему оповещения. По задумке на фитнес-браслет должно приходить сообщение, если выполняются какие-то заданные условия. Например, за последние 3 минуты цена на нефть Brent изменилась на 20 пунктов. Условия для оповещений могут быть разные. 1С мониторит биржевую информацию и отсылает мне сообщения. Чтобы не проспать ситуацию.
   Numerus Mikhail
 
9 - 28.11.17 - 12:49
(8) В разы проще, как мне кажется, сделать это не на 1с.
   Torquader
 
10 - 28.11.17 - 12:53
Тогда у него, скорей всего, отдельный процесс как служба Windows, а то, что подключается к процессу 1С, это посредник, который получает от службы информацию и передаёт её в 1С.
Я бы, в данном случае, нарисовал сценарий, который получает события из объекта и передаёт их в 1С через Http-сервис - тогда, пока сервис обрабатывает одно событие, будут приходить остальные и накапливаться в буфере, чтобы их передать потом, после завершения запроса следующим.
Тогда, во-первых, не нужно будет держать отдельную форму на клиенте для получения событий, а также можно будет работать в 1С не боясь, что события потеряются.
 
 
   Сниф
 
11 - 28.11.17 - 12:54
(9) Для анализа информации я планирую использовать индексированные таблицы значений, например. Где еще такая лепота есть, кроме как в 1С?

А на чем делать, если не на 1С? Кроме 1С я только знаю немного о разработке веб-приложений. Но они ком-объекты не используют же.
   Сниф
 
12 - 28.11.17 - 12:56
(10) Хорошая идея! А как быстрее в 1С через Http-сервис или через локальные текстовые файлы? Если это не сервер, а домашний компьютер.
   Torquader
 
13 - 28.11.17 - 13:02
Можно, скажем, развернуть SQL-Express и работать с ним - там уж точно все функции быстрого выполнения запросов будут доступны.
У меня, просто, 1С при работе с COM-объектами, которые генерят события - падала, что мне очень не понравилось.

P.S. я бы взял книгу по Java (иностранцы его любят) и пытался биржевой информатор туда прикрутить - это потом даже можно продать как готовое решение в отличие от 1С.

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


Список тем форума
Рекламное место пустует   Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует