Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо