Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.05;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
15-1183728592
dima123
2007-07-06 17:29
2007.08.05
иконки...


2-1183982241
..::KraN::..
2007-07-09 15:57
2007.08.05
Из ImageList в image


2-1184076465
Knob
2007-07-10 18:07
2007.08.05
Выгрузка данных из таблицы Excel


4-1171636729
Vemer
2007-02-16 17:38
2007.08.05
Как уничтожать назначенный Brush?


2-1184052234
AZIZE
2007-07-10 11:23
2007.08.05
несовместимость типов