К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

OM и асинхронный вызов. Непонятки с событиями

Гость
0 - 04.06.2012 - 11:23
Добрый день.
Впервые решил разработать ком-сервер, и столкнулся в одной очень интересной проблемой.
Мой сервер общается с клиентами средствами событий. т.е. создан dispinterface событий на которые подписывается клиент. Делал все по мануалу. Забегая на перед скажу что данная связка реализрована и работает в штатном режиме отлично.
Генеральная задача ком-сервака - это коннект к некой софтине через функции реализованные в DLL (реализация моя). Моя DLL периодически вызывает функции из DLL поставляемой с вышеупомянутой софтиной. Связка "моя DLL - DLL API сторонней софтины" понадобилась чтобы нарастить некий функционал. Связка "ком-сервер - моя DLL" понадобилась чтобы уйти от ограничения "одна DLL - один клиент" (это будет системы роботизированного трейдинга на бирже). Итак, ком-сервер коннектится к DLL (объект работающий с DLL реализует паттерн Синглтон), а неопределенное количество клиентов в ком-серверу. Все получается складно.

НО

В API DLL сторонней есть функции которые работают асинхронно. В обработчики этих callback-ов я прописал вызов внешних собственных callback-ов с ком-сервака, чтобы передавать через них нужные мне параметры. И они не работают. Если я свой внешний callback вызываю в функции которая непосредственно вызывается с сервака - все корректно, клиенты получают события инициируемые этими callback-ами на серваке. А если мой callback прописан в обработчике callback-а передаваемого в DLL API сторонней софтины, то клиенты просто не видят сгенеренные события... В ком-серваке событие инициируется и отправляется подписчику:

procedure TRobotArmyServerAutomation.OnResultOperations(ACod eResult: Integer;
ADescription: LPCTSTR);
begin
if FEvents <> nil then
FEvents.OnResultOperationsEvent(ACodeResult, ADescription);
end;


, а подписчик их тупо не видит... как-будто сервер молчит.

В какую сторону копать подскажите плиз... В чем может быть причина?

Сервер, клиент реализован на delphi.
DLL на с++...



Гость
1 - 04.06.2012 - 11:25
В заголовке темы: "СОМ".... копи-паст блин.
Гость
2 - 04.06.2012 - 21:26
В общем прикол в том, что сервак, генерируя события видит клиента, но клиент не может его услышать из-за особенностей STA (настройки фабрики tmApartment). Как только я указал в параметрах фабрики классов tmFree или tmBoth - клиент прозрел на нужные события. Впринцыпе и сервер и клиент будут однопоточными, поэтому AV быть не должно.

Если есть корректировки к моим умозаключениям буду только рад.
Гость
3 - 05.06.2012 - 09:51
Пачиму Дельфи??? :)))
Гость
4 - 05.06.2012 - 18:25
3-And justice for all > Потому что приложения которые преобразовались в com-клиенты изначально (очень давно) были написаны на делфи, и далее поддерживаться будут делфистами как, собственно, и сам сервак. :)
Гость
5 - 06.06.2012 - 06:09
если в DLL передается функция, вызываемая ею при определенных обстоятельствах, и внутри этой функции производится вызов функций, переданных клиентами в COM-объект, то все должно работать. однако, если в этих клиентских функциях происходит вызов методов STA COM-объекта, то они не пройдут - объект блокирован вызовом со стороны DLL и вызов его метода будет ожидать снятия блокировки. естественно, ожидание будет вечным. если все необходимое клиентские функции получают через аргументы и не обращаются к COM-объекту, то, вроде должно работать и с STA COM-объектом.
Гость
6 - 06.06.2012 - 13:37
5-vxg > У меня следующая связка (есть 2 совмещенных варианта):
1-й варинат) В dll передается некие callback-и, обработчиками которых являются процедуры на базе ком-сервера. Внутри этих процедур идет вызов событий объекта-синглтона (не COM). Далее существует COM-объект, который при инициализации передает ссылки на свои события событиям синглтона. Таким образом. В событиях COM-объекта релизована работа с FEvents (рассылка событий). Все это выполняется в штатном синхронном и отлично работатет.
2-вариант) В DLL есть функции которые выполняются асинхронно. Т.е. функция может отработать в лююбой момент вне зависисмости от того когда ее это попросили сделать. В этой асинхронной функции прописан callback работающий по пронципу описанному выше. и эта схема не работала.

Ре работала по причине того, что DLL выполняет асинхронные функции в другом потоке, поэтому при использовании потоковой модели основанной на STA, сервер инициируя событие терял истенный указатель на подписчика. поэтому на стороне сервера все происходило как положено, а клиент просто напросто не видел то что в него прилетает.

Какими то специальными способами я это не проверял, но на практике похоже что я прав... Надо проверить чтоб прийти к однозначности утверждения ))))
Гость
7 - 06.06.2012 - 17:41
как то очень заумно. я даже не знаю что такое события) я думал ком объект при создании загружает длл и передает ей указатели на функции обратного вызова (обычные функции живущие в одном модуле с ком объектом). длл когда ей вздумается вызывает эти функции а изнутри этих функций идет обращение к ком объекту ну а уже оттуда обращения к пользовательской стороне через зарегистрированные на ком объекте функции обратного вызова индивидуальные для каждого пользователя ком объекта. что такое события (для расширения кругозора)? вызовы реально проходят и улетают в никуда (ведется лог и он подтверждает что прога жива) или может просто она все таки висит на этом месте?
Гость
8 - 06.06.2012 - 22:06
drmiller, http://rsdn.ru/article/com/apartmnt.xml - вот, почитай, может поможет. Заодно и еще там кучу статей найдешь, возможно по теме. :)
Гость
9 - 07.06.2012 - 12:15
8-And justice for all >Спасибо, хорошая статья.


К списку вопросов






Copyright ©, Все права защищены