Показать сообщение отдельно
Старый 23.07.2004, 11:45   #5  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Спасибо всем за внимание, Я РЕШИЛ ПРОБЛЕМУ.
Счастья полные штаны. Перехватывать асинхронные события изве в Axapta - реально!

Цитата:
SComm прекрасно отлавливает события - не совсем понимаю, при чем здесь таймер? Или имелась в виду задержка чтения (sleep())?
Повторю свой постинг из форума маззи - надеюсь станет понятно в чём БЫЛА проблема:

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

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

ИТАК, данную проблему можно прекрасно разрешить если вспомнить про т.н. "apartment model". Если кого то интересует могу поподробнее объяснить.