|
|
|
iljy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 23.6.2013 Репутация: нет Всего: нет |
Всем доброго времени суток.
Подскажите плз, есть ли адекватный способ установить таймаут на вызов COM-метода на стороне клиента? Опишу задачу поподробнее: имеется приложение-сервис, которое в процессе работы получает данные через COM-вызовы у другого сервиса (у OPC-сервера, если это поможет). Сервисы физически на разных компах, и соединение между ними ненадежно, связь периодически рвется. Проблема в том, что вызов при этом замирает на приличное время (секунд 40-45), что очень неприятно, при этом в нормальных условиях ответ получается быстро, так что если его нет 2-3 секунды - уже понятно, что беда. Единственный более-менее вменяемый вариант, который я нагуглил - использовать IMessageFilter::MessagePending и прерывать выполнение при превышении времени, но, как я сказал, приложение-сервис, пользовательских сообщений нет, так что придется городить какой-то таймер и рассылать сообщения самому себе. Можно, но как-то громоздко и коряво. PS Предупреждая лишние уходы в сторону: не надо рассказывать про многопоточные приложения и асинхронное чтение, сервис уже и так многопоточный, а асинхронными можно сделать не все вызовы, да и в данном конкретном случае обратные RPC запрещены политиками домена. Я также знаю, что можно вешать на данные таймстампы и проверять их давность и т.п, и принудительно рубить поток, выполняющий вызов, эти решения очевидны, равно как и очевидны их недостатки. Хотя, возможно, есть какие-то другие варианты применения таких подходов, которые я не учел Спасибо! |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
||||
|
||||
iljy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 23.6.2013 Репутация: нет Всего: нет |
||||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Асинхронный вызов позволяет сначала позвать метод, а потом ждать его окончания с заданным таймаутом. По моему это именно то, что вам было нужно?
Добавлено через 3 минуты и 1 секунду Осталось только убедится, что сервер поддерживает асинхронные вызовы, а это далеко не всегда так Добавлено через 11 минут и 7 секунд Вот, еще нашел нечто. Очень похоже на то, что вы хотели. |
|||
|
||||
iljy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 23.6.2013 Репутация: нет Всего: нет |
Из описания метода я не понял, где именно реализуются Begin_... Finis_... и интерфейс ISynchronize, если на стороне клиента - то можно попробовать, а если на стороне сервера - так они сами и встанут в таймаут, если соединение пропало О, а вот это похоже! Спасибо, буду разбираться |
|||
|
||||
xvr |
|
||||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
На стороне сервера должен быть реализован ICallFactory. Остальное реализует сам DCOM
Нет, Begin_ возвращается немедленно, не дожидаясь ответа от сервера. Этим заведуют proxy из DCOM'а |
||||
|
|||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |