Re[2]: Асинхронный вызов IAdviseSink в Win2000
От: Момотов Виктор Сергеевич www.insat.ru
Дата: 19.04.02 04:30
Оценка:
Здравствуйте Sergey, Вы писали:

G>>Я использую интерфейс IAdviseSink для приема данных от OPC-серверов стандарта 1.0 (сервер с некоторым периодом отправляет клиенту через IAdviseSink::OnDataChange некоторые данные). Мой sink находится в многопоточном апартаменте.


S>Насколько я знаю, outgoing вызовы (события) всегда были асинхронными. В частности, в описании интерфейса IAdviseSink про это говориться: Calls to IAdviseSink methods are asynchronous, so the call is sent and then the next instruction is executed without waiting for the call's return


Да, я как то пропустил это (надо почаще в MSDN залезать)... Хорошо, что новый стандарт OPC 2.0 использует ConnectionPoint-ы, вызовы через которые синхронные.

S>На твоем месте я бы завел очередь, куда быстро укладывал бы данные, приходящие в OnDataChange, и рабочий поток, который медленно (вернее, так быстро, как только возможно ) разбирал бы очередь. Впрочем, если у тебя клиент за сервером не успевает в среднем, а не только при пиковой загрузке, все равно не поможет.


Да, отложенная обработка в моем случае проблему целиком не решит, так что пришлось пока отклонять новые входящие вызовы при превышении некоторого порога одновременно обрабатываемых. А по-хорошему надо регулировать входящий поток (типа период опроса увеличивать).

G>>P.S. Проблема обнаружилась, после того, как программа упала, когда количество потоков перевалило за тысячу.


S>Памяти под стеки потоков не хватило?


Программа не совсем падает, просто подвисает конкретно. А так вообще до 2000 потоков иногда доходило...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.