15.07.2004, 05:37 | #1 |
Участник
|
Стоит задача подключения сканнера штрих-кодов Symbol LS2200 к Axapta. Сканнер подключается к COM-порту и работает по спецификации OPOS через COM-объект (как бы драйвер). Сущность взаимодействия между приложением и драйвером состоит в том что при возникновении события (типа сканирования) COM-объект драйвера вызывает call-back ф-ю (на самом деле метод написанного вами COM-обеъкта-обработчика) приложения.
Проблема состоит в том что драйвер сканнера работает в отдельном потоке и call-back ф-я вашего приложения соответственно тоже запускается в нём и стоит задача согласования вызовов этой ф-ии с основным потоком программы. В 1С эта задача решалась элементарно за счёт наличия механизма внешних событий, (ф-я ОбработкаВнешнегоСобытия), специально предназначенного для обработки сообщений, поступающих из других процессов/потоков. Подскажите как наиболее грамотно реализовать в аксапте такую обработку внешних событий. |
|
15.07.2004, 14:18 | #2 |
Участник
|
Поддержки com-порта в стандартной Аксапте нет.
Рекомендация такая - пишите ActiveX (или ищите готовый) Далее, ActiveX с событиями можно вставить на форму и указать какой метод аксапты обрабатывает то или иное событие ActivX'а. Подробнее - руководство разработчика ключевое слово "Adding an ActiveX control to a form" |
|
16.07.2004, 10:26 | #3 |
Участник
|
Цитата:
Сообщение от mazzy
Поддержки com-порта в стандартной Аксапте нет.
Рекомендация такая - пишите ActiveX (или ищите готовый) Далее, ActiveX с событиями можно вставить на форму и указать какой метод аксапты обрабатывает то или иное событие ActivX'а. Подробнее - руководство разработчика ключевое слово "Adding an ActiveX control to a form" Однако основная проблема всё равно остаётся открытой. Дело в том что обычные 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 |
Участник
|
Можно ли не в форме получать события от COM объектов? и вообще какой набор callbackov есть в Axapta?
|
|
05.08.2004, 16:33 | #5 |
Участник
|
Для работы с COM используется класс COM. Но в нем нет возможности работы с асинхронными событиями.
Callback'и: работать через хандлеры контролов и окон. но это уж очень геморно на мой взгляд. См. форму tutorial_window работать с тредами (Thread). См. класс TutorialThread работать с DDE См. класс Tutorial_DDETest, формы tutorial_Dde_Client, tutorial_Dde_Server работать с таймером См. форму tutorial_Timer |
|
05.08.2004, 16:34 | #6 |
Участник
|
а вообще говоря, штатный режим работы с событиями - вставить ActiveX в форму.
|
|