Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1183798091
Maxoglot
2007-07-07 12:48
2007.08.05
Сортировка вещественных чисел


15-1183655714
@!!ex
2007-07-05 21:15
2007.08.05
НЕ смотрится DVD.


3-1177488926
vajo
2007-04-25 12:15
2007.08.05
Подскажите SQl запрос для выборки клиентов по дню рождения.


15-1183949290
Slider007
2007-07-09 06:48
2007.08.05
С днем рождения ! 9 июля 2007 понедельник


2-1183442387
..::KraN::..
2007-07-03 09:59
2007.08.05
Округление дроби





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский