AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.07.2004, 05:37   #1  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Стоит задача подключения сканнера штрих-кодов Symbol LS2200 к Axapta. Сканнер подключается к COM-порту и работает по спецификации OPOS через COM-объект (как бы драйвер). Сущность взаимодействия между приложением и драйвером состоит в том что при возникновении события (типа сканирования) COM-объект драйвера вызывает call-back ф-ю (на самом деле метод написанного вами COM-обеъкта-обработчика) приложения.
Проблема состоит в том что драйвер сканнера работает в отдельном потоке и call-back ф-я вашего приложения соответственно тоже запускается в нём и стоит задача согласования вызовов этой ф-ии с основным потоком программы.

В 1С эта задача решалась элементарно за счёт наличия механизма внешних событий, (ф-я ОбработкаВнешнегоСобытия), специально предназначенного для обработки сообщений, поступающих из других процессов/потоков.

Подскажите как наиболее грамотно реализовать в аксапте такую обработку внешних событий.
Старый 15.07.2004, 14:18   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Поддержки com-порта в стандартной Аксапте нет.
Рекомендация такая - пишите ActiveX (или ищите готовый)

Далее, ActiveX с событиями можно вставить на форму и указать какой метод аксапты обрабатывает то или иное событие ActivX'а.

Подробнее - руководство разработчика ключевое слово "Adding an ActiveX control to a form"
__________________
полезное на axForum, github, vk, coub.
Старый 16.07.2004, 10:26   #3  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Сообщение от mazzy
Поддержки com-порта в стандартной Аксапте нет.
Рекомендация такая - пишите ActiveX (или ищите готовый)

Далее, ActiveX с событиями можно вставить на форму и указать какой метод аксапты обрабатывает то или иное событие ActivX'а.

Подробнее - руководство разработчика ключевое слово "Adding an ActiveX control to a form"
Спасибо огромное за совет! Действительно я еще ломал голову как внедрить COM-объект в аксапту так чтобы и аксапта могла вызывать его методы, и объект мог вызывать события в ней - интеграция с ActiveX это решает.
Однако основная проблема всё равно остаётся открытой.
Дело в том что обычные ActiveX контролы запускаются и целиком и полносью работают в рамках того же процесса и потока, в котором выполняется основная программа и поэтому никаких проблем не возникает - при возникновении Event-а метод его обработки работает как надо.
Например, если я делаю ActiveX-control, который активирует внутри себя WinAPI-шный таймер (который выполняется в рамках очереди сообщений основного потока процесса), и в Event-е пишу print "Event" - всё работает замечательно - с периодичностью 1секунда в print window выводится эта строка.

Тут же трудность состоит в том что объект драйвера выполняется в отдельном потоке и Event соответственно срабатывает в нём. А так как в это время сама аксапта может уже (и как правило так и происходит) заниматсься своими делами (реакцией на ввод, какие то внутренние циклы), то получается событие "вклинивается" в нормальный ход вещей совсем ненормальным образом.
Например если я пишу в своём ActiveX контроле инициализацию thread-а, в котором периодически пытаюсь активировать Event - приложение рушится без лишних вопросов.
Тут нужно сработать таким образом, чтобы активация событий была синхронизирована с работой основного кода аксапты. В 1С для этого специально был предусмотрен механизм внешних сообщений, вот я и подумал - а нет ли такого в аксапте тоже? Может можно хотя бы в основной поток GetMessage/DispatchMessage ложить свои сообщения?

Можно конечно пойти по простому пути - не пользоваться событиями драйвера сканнера, а просто опрашивать его периодически (каждую секунду например) на предмет наличия введенных данных (при таком подходе даже ActiveX не потребуется), но хочется чтобы всё оптимально было.
Впрочем возможно в аксапте, в отличие от 1С нет простого решения такой задачи...
Старый 05.08.2004, 15:11   #4  
mugz is offline
mugz
Участник
 
107 / 10 (1) +
Регистрация: 05.08.2004
Можно ли не в форме получать события от COM объектов? и вообще какой набор callbackov есть в Axapta?
Старый 05.08.2004, 16:33   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Для работы с COM используется класс COM. Но в нем нет возможности работы с асинхронными событиями.

Callback'и:

работать через хандлеры контролов и окон.
но это уж очень геморно на мой взгляд.
См. форму tutorial_window

работать с тредами (Thread).
См. класс TutorialThread

работать с DDE
См. класс Tutorial_DDETest, формы tutorial_Dde_Client, tutorial_Dde_Server

работать с таймером
См. форму tutorial_Timer
__________________
полезное на axForum, github, vk, coub.
Старый 05.08.2004, 16:34   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
а вообще говоря, штатный режим работы с событиями - вставить ActiveX в форму.
__________________
полезное на axForum, github, vk, coub.
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:09.