Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Таймаут COM-вызова 
:(
    Опции темы
iljy
Дата 23.6.2013, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 23.6.2013

Репутация: нет
Всего: нет



Всем доброго времени суток.

Подскажите плз, есть ли адекватный способ установить таймаут на вызов COM-метода на стороне клиента?

Опишу задачу поподробнее:
имеется приложение-сервис, которое в процессе работы получает данные через COM-вызовы у другого сервиса (у OPC-сервера, если это поможет). Сервисы физически на разных компах, и соединение между ними ненадежно, связь периодически рвется. Проблема в том, что вызов при этом замирает на приличное время (секунд 40-45), что очень неприятно, при этом в нормальных условиях ответ получается быстро, так что если его нет 2-3 секунды - уже понятно, что беда.

Единственный более-менее вменяемый вариант, который я нагуглил - использовать IMessageFilter::MessagePending и прерывать выполнение при превышении времени, но, как я сказал, приложение-сервис, пользовательских сообщений нет, так что придется городить какой-то таймер и рассылать сообщения самому себе. Можно, но как-то громоздко и коряво.

PS Предупреждая лишние уходы в сторону: не надо рассказывать про многопоточные приложения и асинхронное чтение, сервис уже и так многопоточный, а асинхронными можно сделать не все вызовы, да и в данном конкретном случае обратные RPC запрещены политиками домена. Я также знаю, что можно вешать на данные таймстампы и проверять их давность и т.п, и принудительно рубить поток, выполняющий вызов, эти решения очевидны, равно как и очевидны их недостатки. Хотя, возможно, есть какие-то другие варианты применения таких подходов, которые я не учел smile

Спасибо!

PM MAIL   Вверх
xvr
Дата 24.6.2013, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 6996
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 8
Всего: 222



PM MAIL   Вверх
iljy
Дата 25.6.2013, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 23.6.2013

Репутация: нет
Всего: нет



Цитата(xvr @  24.6.2013,  14:06 Найти цитируемый пост)
Асинхронные COM вызовы не подойдут?


Не-а. Проблема же не в том, что вызов долго выполняется, а в том, что отвалилось соединение и до сервера запрос просто не доходит, но возврат управления клиенту происходит по истечении внутреннего таймаута, а он очень большой.

PM MAIL   Вверх
xvr
Дата 25.6.2013, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 6996
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 8
Всего: 222



Асинхронный вызов позволяет сначала позвать метод, а потом ждать его окончания с заданным таймаутом. По моему это именно то, что вам было нужно?

Добавлено через 3 минуты и 1 секунду
Осталось только убедится, что сервер поддерживает асинхронные вызовы, а это далеко не всегда так  smile

Добавлено через 11 минут и 7 секунд
Вот, еще нашел нечто. Очень похоже на то, что вы хотели.

PM MAIL   Вверх
iljy
Дата 25.6.2013, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 23.6.2013

Репутация: нет
Всего: нет



Цитата(xvr @  25.6.2013,  00:48 Найти цитируемый пост)
Асинхронный вызов позволяет сначала позвать метод, а потом ждать его окончания с заданным таймаутом. По моему это именно то, что вам было нужно?
Добавлено через 3 минуты и 1 секунду
Осталось только убедится, что сервер поддерживает асинхронные вызовы, а это далеко не всегда так  


Из описания метода я не понял, где именно реализуются Begin_... Finis_... и интерфейс ISynchronize, если на стороне клиента - то можно попробовать, а если на стороне сервера - так они сами  и встанут в таймаут, если соединение пропало smile

Цитата(xvr @  25.6.2013,  00:48 Найти цитируемый пост)
Вот, еще нашел нечто. Очень похоже на то, что вы хотели.


О, а вот это похоже! Спасибо, буду разбираться smile
PM MAIL   Вверх
xvr
Дата 25.6.2013, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 6996
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 8
Всего: 222



Цитата(iljy @  25.6.2013,  02:13 Найти цитируемый пост)
Из описания метода я не понял, где именно реализуются Begin_... Finis_... и интерфейс ISynchronize,

На стороне сервера должен быть реализован ICallFactory. Остальное реализует сам DCOM

Цитата(iljy @  25.6.2013,  02:13 Найти цитируемый пост)
а если на стороне сервера - так они сами  и встанут в таймаут, если соединение пропало

Нет, Begin_ возвращается немедленно, не дожидаясь ответа от сервера. Этим заведуют proxy из DCOM'а

PM MAIL   Вверх
Google
  Дата 18.8.2019, 05:35 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0721 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.