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