STA + GIT
От: slava_529872  
Дата: 11.10.05 08:00
Оценка:
Добрый день всем!

Есть проблема. EXE server — oбычный STA с 3 потоками (один главный + 2 рабочих). Рабочие потоки используют интерфейсы, полученные в главном потоке и отмаршаленные через GIT (CComGITPtr). Проблема следующая: иногда GIT не хочет производить маршалинг. Т.е. вызов GetInterfaceFromGlobal завершается с E_UNEXPECTED. CoInitialize для всех потоков вызван, GIT проинициализирован.... куки имеют свои значения...вообщем ничего не предвещает беды...но блин в 30% случаев GIT не работает. Причем, если он не маршалит, то не маршалит все указатели...


Заранее спасибо!
Re: STA + GIT
От: Ivan Россия www.rsdn.ru
Дата: 11.10.05 09:07
Оценка:
Здравствуйте, slava_529872, Вы писали:

_>Добрый день всем!

Скорее всего, ты пытаешься это делать внутри обработчика синхронного сообщения, отправленного с помощью SendMessage
http://www.rsdn.ru/Forum/Message.aspx?mid=352302&only=1
Автор: UnrealAlex
Дата: 13.08.03


От STA лучше избавляться, если проект UI ориентированный, то одного STA (главного) будет вполне достаточно, а рабочие потоки лучше перевести в MTA
Re[2]: STA + GIT
От: slava_529872  
Дата: 11.10.05 09:30
Оценка:
Здравствуйте, Ivan, Вы писали:

I>Здравствуйте, slava_529872, Вы писали:


_>>Добрый день всем!

I>Скорее всего, ты пытаешься это делать внутри обработчика синхронного сообщения, отправленного с помощью SendMessage
I>http://www.rsdn.ru/Forum/Message.aspx?mid=352302&only=1
Автор: UnrealAlex
Дата: 13.08.03


I>От STA лучше избавляться, если проект UI ориентированный, то одного STA (главного) будет вполне достаточно, а рабочие потоки лучше перевести в MTA


Неа... я не из обработчика синхронного сообщения, отправленного с помощью SendMessage это делаю. Я это делаю сразу в начале потоковой функции...после CoInitialize конечно.

У меня задача — не UI ориентированная. Рабочие потоки служат для поставки операций, вызываемых клиентом в очередь (асинхронные вызовы).

MTA по-моему напряжно будет, если я не ошибаюсь... мне надо, чтобы события генерились из рабочих потоков например.... я не умру с MTA ?
Re: STA + GIT
От: slava_529872  
Дата: 11.10.05 11:30
Оценка:
вроди как решил проблему...надо ещё потестить побольше... Нашел на заграничном сайте диалог меж двумя английцами. У одного мои же грабли. А второй ему советовал для интерфейса, указатель на который маршалится постаить атрибут "oleautomation". Я возьми да и поставь тоже.... работает пока). Ох уж эти кзэзи инглиш пипл)
Re[3]: STA + GIT
От: Ivan Россия www.rsdn.ru
Дата: 12.10.05 07:03
Оценка:
Здравствуйте, slava_529872, Вы писали:

_>Здравствуйте, Ivan, Вы писали:


_>Неа... я не из обработчика синхронного сообщения, отправленного с помощью SendMessage это делаю. Я это делаю сразу в начале потоковой функции...после CoInitialize конечно.

_>У меня задача — не UI ориентированная. Рабочие потоки служат для поставки операций, вызываемых клиентом в очередь (асинхронные вызовы).
_>MTA по-моему напряжно будет, если я не ошибаюсь... мне надо, чтобы события генерились из рабочих потоков например.... я не умру с MTA ?

CoInitialize ты с какими флажками вызываешь? если рабочие потоки создают свои собственные STA, то они должны иметь цикл выборки сообщений из очереди. Т.к. у тебя уже используется GIT, то рабочие потоки могут использовать любую потоковую модель и MTA для них подходит гораздо лучше — не нужен цикл сообщений и не будет проблем с реентерабельностью. Насчет oleautomation из соседнего поста — у тебя до этого был не automation интерфейс? тогда проблема могла быть вызвана отсутствием proxy/stub (компилировал проект для proxy/stub ?) — но не в 30% а в 100% вызвов

и если проект не UI ориентированный, то главный поток тоже запросто может войтив MTA, а не в STA, тогда не будет маршалинга между потоками и не будет специфичных для STA проблем.
Re[4]: STA + GIT
От: slava_529872  
Дата: 12.10.05 13:01
Оценка:
Здравствуйте, Ivan, Вы писали:

I>CoInitialize ты с какими флажками вызываешь?

CoInitialize(NULL)

I>Насчет oleautomation из соседнего поста — у тебя до этого был не automation интерфейс? тогда проблема могла быть вызвана отсутствием proxy/stub (компилировал проект для proxy/stub ?) — но не в 30% а в 100% вызвов

Так точно! Теперь компилирую и регистрирую proxy/stub. Работает нормально.

I>и если проект не UI ориентированный, то главный поток тоже запросто может войтив MTA, а не в STA, тогда не будет маршалинга между потоками и не будет специфичных для STA проблем.

Ясненько.

Спасибо тебе Иван большое за чуткость и хорошие советы!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.