Re[4]: DCOM самовосстанавливающиеся соединение
От: ZORK Россия www.zorkaltsev.com
Дата: 22.08.01 21:21
Оценка:
Здравствуйте VladD2, вы писали:

VD>Почитай вот это http://www.optim.ru/cs/2000/4/com_htm/com_2.asp


Спасибо! — натолкнуло на мысли и эксперементы. Оказалось:

— можно сделать cancel сообщения в ATM, если добавить IMessageFileter::MessagePending и возвращать из него после timeout'а PENDINGMSG_CANCELCALL, но так как MessagePanding вызывается, только тогда когда приходит Windows сообщение, то полезно перед COM-вызовом сделать ::SetTimer(wnd, timeout), что-бы сообщение точно пришло, а то опять будет весеть до бесконечности, особенно если это проиходит в нитке не связанной с видимым окном

— нашел у MS следующие рассуждения http://msdn.microsoft.com/library/en-us/com/hh/com/asyncall_8yur.asp?frame=true , из которых следует что CoCancelCall более общий способ прерывать COM-вызовы — он работает для любой модели, в то время как IMessageFileter только для ATM

— вернулся обратно к эксперементу с CoCancelCall — оказалось, что я был рядом. Выяснилось, что для того что-бы прервать COM команду, надо вызвать CoCancelCall пару раз, кстати такое же наблюдалось с IMessageFileter::MessagePending. Надо полагать, при удаленном вызове есть какая-то внутреняя вложенность вызовов. После того как watchdog нитка стала многократно вызывать CoCancelCall — вызовы стали успешно прерываться. Так что проблема решена

Всем спасибо!
Думать надо ...головой :)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.