Форум: "Основная";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
ВнизCOM сервер с событиями Найти похожие ветки
← →
GuAV © (2007-05-22 18:26) [0]In-process Automation Object создаёт свой thread и файрит события оттуда через соответствующий IXxxxxEvents интерфейс, IXxxxxEvents получается через FConnectionPoints.
Верно ли что:
Модель Apartment-thread для такого сервера применить не получится, Automation Object должен быть Free-thread.
Если поток клиента вызвал CoInitializeEx с COINIT_APARTMENTTHREADED или CoInitialize для инициализации COM, то события будут вызыватся в контексте создавшего потока. Если поток клиента вызвал CoInitializeEx с COINIT_MULTITHREADED, то события будут вызыватся в контескте потока, откуда они файрятся.
Никаких дополнительных действий для синхронизации вызовов событий и маршалинга интерфейсов производить не требуется.
?
← →
umbra © (2007-05-22 18:47) [1]
> In-process Automation Object создаёт свой thread
имеется в виду, что каждый экземпляр сервера создает один поток для своей работы?
← →
guav © (2007-05-22 18:53) [2]
> имеется в виду, что каждый экземпляр сервера создает один
> поток для своей работы?
Да.
Вообще вряд ли будет создано более одного экземпляра сервера.
← →
umbra © (2007-05-22 18:54) [3]а клиентов будет много?
← →
guav © (2007-05-22 19:19) [4]тоже один.
хотя хотелось бы получить ответ для наиболее общего случая.
← →
umbra © (2007-05-22 19:24) [5]
> Модель Apartment-thread для такого сервера применить не
> получится, Automation Object должен быть Free-thread.
почему? потоковая модель сервера (Apartmentthreaded или Freethreaded) на самом деле не имеет отношения к количеству потоков на сервере. Она определяет порядок обработки запросов от клиентов. У Apartmentthreaded сервера все запросы выполняются синхронно с вызовами, т.е. по очереди. Т.е. пока вызов1 не возвратит результат вызов2 не начнет обрабатываться. У Freethreaded - асинхронно за счет того, что подсистема СОМ создаст пул потоков и будет управлять ими сама.
← →
guav © (2007-05-22 19:29) [6]
> > Модель Apartment-thread для такого сервера применить не
> > получится, Automation Object должен быть Free-thread.
> почему?
потому что методы интерфейсом для событий IXxxxxEvents нельзя будет пользоватся в том дополнительном потоке
← →
umbra © (2007-05-22 19:39) [7]
> IXxxxxEvents нельзя будет пользоватся в том дополнительном
> потоке
но почему? я, честно говоря, не вижу причин для этого. К примеру, тот же эксель работает в STA и события там прекрасно работают
← →
guav © (2007-05-22 19:52) [8]
> К примеру, тот же эксель работает в STA и события там прекрасно
> работают
Эксель, видимо, запускает события из оконной процедуры, то есть в контексте того потока, в контексте которого работают его методы.
У меня In-process сервер без окон и события возникают в контексте его рабочего потока, не внури какого либо метода и не в оконной процедуре.
Вообще, что-то не могу найти информацию о событиях в COM в Delphi.
← →
guav © (2007-05-22 20:07) [9]Нашел, для STA действительно нельзя вызывать методы интерфейсов из другого потока просто так, но можно осуществить маршалинг интерфейса в другой STA поток.
http://support.microsoft.com/kb/206076/en-us
← →
guav © (2007-05-27 01:20) [10]Сделал таки STA сервер, маршалинг диспинтерфейса событий в другой аппартмент осуществил через IGlobalInterfaceTable . Вроде работает.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.051 c