Асинхронный вызов IAdviseSink в Win2000
От: greatvict www.insat.ru
Дата: 18.04.02 05:36
Оценка:
Я использую интерфейс IAdviseSink для приема данных от OPC-серверов стандарта 1.0 (сервер с некоторым периодом отправляет клиенту через IAdviseSink::OnDataChange некоторые данные). Мой sink находится в многопоточном апартаменте.

В операционной системе Windows 2000 возникла следующая проблема — если я в клиенте не успеваю обрабатывать вызовы IAdviseSink::OnDataChange, то происходит взрывное увеличение количества одновременных входящих вызовов, и, соответственно, такое же увеличение количества потоков, в которых эти вызовы обрабатываются. Стек при вызове выглядит следующим образом —

COPCGroupDef::OnDataChange(COPCGroupDef * const 0x08022b48, tagFORMATETC * 0x07d20758, tagSTGMEDIUM * 0x07d2f3c8)
OLE32! AsyncIAdviseSink_Begin_OnDataChange_Stub@12 + 18 bytes
OLE32! AsyncIAdviseSink_Begin_RemoteOnDataChange_Thunk@4 + 21 bytes
RPCRT4! NdrStubCall2@16 + 27498 bytes
........................


Это очень похоже на асинхронный вызов синхронного интерфейса Win2000, но серверы были выпущены до выхода Windows 2000 и, понятное дело, никаких специфичных для Win2000 средств использвать не могут. Получается, что Win2000 сама решила, что, поскольку OnDataChange не имеет out-параметров, то ее вполне можно вызывать асинхронно с точки зрения сервера.

Кто нибудь сталкивался с подобной проблемой?

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