Rebyata, vot natolknulsya na problemu s COM ochen ineteresnuyu.
Ya ne spec v COM, no vsye -je nemnoqo ponimayu v etix delax.
U menya com server realizovanniy v vide nt service. I tam neskolko interfeysov A, B, C(vse MTA).
Odin kliyent ispolzuyet metody interfeysa A dlya toqo chtoby dat danniye.
Druqoy kliyent ispolzuyet metody interfeysa B chtoby izvlech eti danniye. I oni obrashayutsya k servery dovolno chasto: raz 50-100 za sekundu. I vsye pashet prekrasno.
no vot koqda sluchayetsya chto oba vizivayut odnovremmenno, vot toqda chto to proisxodit s com interfeysom. I uje nikakoy druqoy modul ne mojet soyedinitsya k serveru. Xotya te kotoriye byli uje soyedineny, oni prodoljayut rabotat.
Ya tak ponyal chto koqda dva metoda na raznix interfeysax vyzyvayutsa odnovremennno proisxodit chto-to vrode com deadlocka, kotoriy ne pozvolyayet soyedinitsya k etomu serveru vnov.
Vse com obyekty v servere ispolzuyut multithreading model.
Здравствуйте Аноним, Вы писали:
А>Rebyata, vot natolknulsya na problemu s COM ochen ineteresnuyu. А>Ya ne spec v COM, no vsye -je nemnoqo ponimayu v etix delax.
А>U menya com server realizovanniy v vide nt service. I tam neskolko interfeysov A, B, C(vse MTA). А>Odin kliyent ispolzuyet metody interfeysa A dlya toqo chtoby dat danniye. А>Druqoy kliyent ispolzuyet metody interfeysa B chtoby izvlech eti danniye. I oni obrashayutsya k servery dovolno chasto: raz 50-100 za sekundu. I vsye pashet prekrasno. А>no vot koqda sluchayetsya chto oba vizivayut odnovremmenno, vot toqda chto to proisxodit s com interfeysom. I uje nikakoy druqoy modul ne mojet soyedinitsya k serveru. Xotya te kotoriye byli uje soyedineny, oni prodoljayut rabotat.
А>Ya tak ponyal chto koqda dva metoda na raznix interfeysax vyzyvayutsa odnovremennno proisxodit chto-to vrode com deadlocka, kotoriy ne pozvolyayet soyedinitsya k etomu serveru vnov.
А>Vse com obyekty v servere ispolzuyut multithreading model.
А>Ne znayu chto delat.
А>uje neskolko nedel byus nad etim.
А>Nadejda, na vashi sovety.
А>Budu ochen priznatelen, za lyubuyu podskazku.
А>Spasibo zaraneye
Привет
Я точно не знаю, у меня похожая проблема, я с ней вожусь уже неделю и пока не могу понять в чем дело
Здравствуйте Аноним, Вы писали:
А>Rebyata, vot natolknulsya na problemu s COM ochen ineteresnuyu. А>Ya ne spec v COM, no vsye -je nemnoqo ponimayu v etix delax.
А>U menya com server realizovanniy v vide nt service. I tam neskolko interfeysov A, B, C(vse MTA).
MTA/STA модели потоков, которые поддерживают объекты, а не интерфейсы. A, B и C — это интерфейсы одного объекта или COM объекты?
Учти, что MTA апартамент может быть только один, т.е. все твои компоненты в одном потоке живут!!! Т.е. ты обязан сам реализовать потоковую безопасность. У меня подозрение, что именно с ней у тебя проблема (с совместным доступом, что-то портится в нутрях). Могу посоветовать, как самый наверное простой вариант, переделать MTA на STA. В этом случае COM сам разделяет доступ к компонентам, хотя доступ к общим данным придется разделять самому.
ICQ #311116826
Re[2]: ochen interesnaya problema s COM + Service
От:
Аноним
Дата:
17.06.02 18:36
Оценка:
Здравствуйте maxim_al, Вы писали:
MA>Здравствуйте Аноним, Вы писали:
А>>Rebyata, vot natolknulsya na problemu s COM ochen ineteresnuyu. А>>Ya ne spec v COM, no vsye -je nemnoqo ponimayu v etix delax.
А>>U menya com server realizovanniy v vide nt service. I tam neskolko interfeysov A, B, C(vse MTA).
Spasibo bolshoye.
MA>MTA/STA модели потоков, которые поддерживают объекты, а не интерфейсы. A, B и C — это
интерфейсы одного объекта или COM объекты?
Da, sovershenno pravilno zametil. Nepravilno vyrazilsya. A, B, C — eto razniye obyekty, vse multithreaded. Yest qlbalnaya structura tipa list, qde xranyatsya danniye. Oni prixodyat iz interfeysa obyekta A i zaprashivayutsya kliyentami iz interfeysa obyekta B. porblema voznikayet koqda Method iz A vizivayetsya, koqda rabotayet method iz B. I proisxodit Bum-BUm. nikto bolshe ne mojet soyedinitsya k serveru. Xotya, connection k A (ono postoyannoye) prodoljayet rabotat, i sam server rabotayet. Vot tolko vse interfeysi ni ne chto ne otvechayut,
MA>Учти, что MTA апартамент может быть только один, т.е. все твои компоненты в одном потоке живут!!! Т.е. ты обязан сам реализовать потоковую безопасность. У меня подозрение, что именно с ней у тебя проблема (с совместным доступом, что-то портится в нутрях)
Ya polojil vezde critical sections. Chto yeshe ya moqu sdelat.
. Могу посоветовать, как самый наверное простой вариант, переделать MTA на STA. В этом случае COM сам разделяет доступ к компонентам, хотя доступ к общим данным придется разделять самому.
Naschet, toqo chtoby, MTA v STA peredelat u menya dva voprosa:
1) Vse li obyekty peredelyvat ili, tolko odin?
2) Sistema ochen kriticheskaya, v smysle chto v sekundu ona obslujivayet 50 kliyentov. A STA predpoloqayet, chto dlya accesa druqix obyektov (i globalnix dannix (naschet etoqo ne uveren ), vyzovy doljny marshalirovartsya, chto mojet snizit proizvoditelnosti. Pravilno?
Mojno, li sdelat chto nibud yeshe. Lyubaya podskazka budet ochen poleznoy. Ya pochti mesyac muchayus. Nicheqo ne moqu sdelat.
I yeshe odin vopros: >Т.е. ты обязан сам реализовать потоковую безопасность. У меня подозрение, что именно с ней у >тебя проблема (с совместным доступом, что-то портится в нутрях).
mojno, qde nibud kakoy nibud sample, knijku posmotret realizacii potokovoy bezopasnosti v dostatochno naqrujennoy sisteme. Vse primery kotoriye, ya videl, oni raschitani na protsiye sluchai.
Yeshe raz zdravstvuyte.
Spasibo bolshoye za poskazku, teper ya znayu qde problema.
Yesli by vy smoqli, pomoch mne i nayti puti resheniya, ya byl by ochen priznatelen.
Vot otvery na predydushiye voprosy:
А>>Rebyata, vot natolknulsya na problemu s COM ochen ineteresnuyu. А>>Ya ne spec v COM, no vsye -je nemnoqo ponimayu v etix delax.
А>>U menya com server realizovanniy v vide nt service. I tam neskolko interfeysov A, B, C(vse MTA).
MA>MTA/STA модели потоков, которые поддерживают объекты, а не интерфейсы. A, B и C — это MA>интерфейсы одного объекта или COM объекты?
Da, sovershenno pravilno zametil. Nepravilno vyrazilsya. A, B, C — eto razniye obyekty, vse multithreaded. Yest qlbalnaya structura tipa list, qde xranyatsya danniye. Oni prixodyat iz interfeysa obyekta A i zaprashivayutsya kliyentami iz interfeysa obyekta B. porblema voznikayet koqda Method iz A vizivayetsya, koqda rabotayet method iz B. I proisxodit Bum-BUm. nikto bolshe ne mojet soyedinitsya k serveru. Xotya, connection k A (ono postoyannoye) prodoljayet rabotat, i sam server rabotayet. Vot tolko vse interfeysi ni ne chto ne otvechayut,
MA>>Учти, что MTA апартамент может быть только один, т.е. все твои компоненты в одном MA>>потоке живут!!! Т.е. ты обязан сам реализовать потоковую безопасность. У меня MA>>подозрение, что именно с ней у тебя проблема (с совместным доступом, что-то портится в MA>>нутрях)
Ya polojil vezde critical sections. Chto yeshe ya moqu sdelat.
MA>> Могу посоветовать, как самый наверное простой вариант, переделать MTA на STA. В этом MA>> случае COM сам разделяет доступ к компонентам, хотя доступ к общим данным придется MA>> разделять самому.
Naschet, toqo chtoby, MTA v STA peredelat u menya dva voprosa:
1) Vse li obyekty peredelyvat ili, tolko odin?
2) Sistema ochen kriticheskaya, v smysle chto v sekundu ona obslujivayet 50 kliyentov. A STA predpoloqayet, chto dlya accesa druqix obyektov (i globalnix dannix (naschet etoqo ne uveren ), vyzovy doljny marshalirovartsya, chto mojet snizit proizvoditelnosti. Pravilno?
Mojno, li sdelat chto nibud yeshe. Lyubaya podskazka budet ochen poleznoy. Ya pochti mesyac muchayus. Nicheqo ne moqu sdelat.
I yeshe odin vopros naschet sleduyusheqo zamechaniya: MA>>Т.е. ты обязан сам реализовать потоковую безопасность. У меня подозрение, что именно с MA>>ней у тебя проблема (с совместным доступом, что-то портится в нутрях).
Mojno, qde nibud kakoy nibud sample, knijku posmotret realizacii potokovoy bezopasnosti v dostatochno naqrujennoy sisteme. Vse primery kotoriye, ya videl, oni raschitani na protsiye sluchai.
Если объекты А и B только обеспечивают доступ к глобальному хранилищу (типа list), то их трогать не надо.
Нужно обложить критической секцией только само хранилище. Про критическую секцию можно прочитатьздесь
class CCritSec
{
// обертка для критической секции
private:
CRITICAL_SECTION m_cs;
public:
CCritSec () { // здесь инитим }
~CCritSec () { // здесь деинитим }
void Lock () { // здесь входим }
void Unlock () { // здесь выходим }
};
class CtreadedSafeList : public OldList,
public CCritSec
{
public:
void Insert ( ANYTYPE& ob )
{
Lock ();
OldList::Insert ( ob );
Unlock ();
}
void Delete ( ANYTYPE& ob )
{
Lock ();
OldList::Delete ( ob );
Unlock ();
}
};
ICQ #311116826
Re[4]: ochen interesnaya problema s COM + Service
От:
Аноним
Дата:
19.06.02 14:32
Оценка:
Spasibo Maksim.
U menya realizovao vsye tochno takje. Chto privelo menya na mysl, chto problema ne v servere a v kliyente, verneye kliyentax. u nix takaya osobennost, chto oni ne derjat connection, i poetomu u menya 20-30 kliyentov otkrivayushix-zakrivayushix com connection raz v sekundu kajdiy.
Mojet li eto byt prichinoy problemy?
i chto ya moqu sdelat? Kliyenty ne ya pisal, i ix koda u menya net. Poetomu ya ix izmenit ne moqu.
yeshe raz spasibo.
Здравствуйте Максим Алексейкин, Вы писали:
МА>Если объекты А и B только обеспечивают доступ к глобальному хранилищу (типа list), то их трогать не надо. МА>Нужно обложить критической секцией только само хранилище. Про критическую секцию можно прочитатьздесь
Тогда проблема не в этом.
A>Chto privelo menya na mysl, chto problema ne v servere a v kliyente, verneye kliyentax. u nix takaya A>osobennost, chto oni ne derjat connection, i poetomu u menya 20-30 kliyentov otkrivayushix-zakrivayushix com A>connection raz v sekundu kajdiy. А>Mojet li eto byt prichinoy problemy?
Задам несколько наводящих вопросов:
— сервер exe или dll?
— сервер удаленный?
— если удаленный используешь чистый DCOM или COM+(MTS)
DCOM может как глючит? Вообще люди советуют использовать COM+ (MTS)
— серверный объект создается новый, при новом подключении, или используется
один и тотже экземпляр?
Количество подключений/отключений влиять не должно.
Извиняюсь забыл про вопрос. Так что первые вопросы снимаются остается один
— серверный объект создается новый, при новом подключении, или используется
один и тотже экземпляр?
ICQ #311116826
Re[7]: ochen interesnaya problema s COM + Service
От:
Аноним
Дата:
20.06.02 11:50
Оценка:
МА>Извиняюсь забыл про вопрос. Так что первые вопросы снимаются остается один
МА>- серверный объект создается новый, при новом подключении, или используется МА> один и тотже экземпляр?
Server eto NT-service, i ispolzuyetstya odin i tot je obyekt.
ProblemA v tom chto, kliyent pisal ne ya, i ne znayu kak on delayet connection.
Sistema rabotayet neskolko chasov bez problem. I vdruq proisxodit chto-to, i posle etoqo uje nikto ne mojet soyedinitsya. Xotya kliyent kotoriy derjit connection, vsye yeshe mojet posylat danniye. A vot sdelat druqoy connection uje nelzya ni na kakom obyekte. Vpechatleniye, takoye kak budto chto-to zakrivayet i blokiriyet entry point k modulu i ko vsem yeqo obyektam.
Здравствуйте Аноним, Вы писали:
А>nikto ne mojet soyedinitsya
Как это "никто не может подключиться" проявляется?
Какие сообщения при этом у клиентов?
Попробуй запустить сервер из под отладчика. При этом объяви макрос _ATL_DEBUG_QI,
если конечно пользуешся ATL, это позволит посмотреть какие интерфейсы вызываются клиентами
и как потом освобождаются.
ICQ #311116826
Re[9]: ochen interesnaya problema s COM + Service
От:
Аноним
Дата:
21.06.02 08:01
Оценка:
МА>Как это "никто не может подключиться" проявляется?
Popytka sdelat connection zakanchivayetsya oshibkoy. To yest cocreateinstance dayet error.
No v to je vremya, kak ya prejde skazal, sushestvuyushiye connections prodoljayut rabotat. МА>Какие сообщения при этом у клиентов?
Ya posmotryu.
МА>Попробуй запустить сервер из под отладчика. При этом объяви макрос _ATL_DEBUG_QI, МА>если конечно пользуешся ATL, это позволит посмотреть какие интерфейсы вызываются клиентами МА>и как потом освобождаются.
Server rabotayet kak nt service, i poetomu sam ponimayesh s otladchikom u neqo trudno.
No ya poprobuyu. I problema v tom chto, eto n e voznikayet srazu, a posle nekotoroqo vremeni.
Yeshe odin vopros, vchera vy sprosili : >- серверный объект создается новый, при новом подключении, или используется >один и тотже экземпляр?
mne ochen interesno. Kakaya raznica? I kak eto viyasnit. Ya dumal raz u tebya exe-com service to vseqda odin i tot je ekzemplyar. Ili ya oshibayus?
Re[10]: ochen interesnaya problema s COM + Service
От:
Аноним
Дата:
21.06.02 08:51
Оценка:
Zapustil server s ATL_DEBUG_QI.
I sdelal kliyent kotoriy kajdiy raz otkrivayet connection (ispolzuya smartpointer), zapuskayet method i zakrivayet connection. i tak beskonechno.
Здравствуйте Аноним, Вы писали:
А>Zapustil server s ATL_DEBUG_QI. А>I sdelal kliyent kotoriy kajdiy raz otkrivayet connection (ispolzuya smartpointer), zapuskayet method i zakrivayet connection. i tak beskonechno.
А>Vot log na servere: А>CDCMod — IUnknown А>CDCMod — IMarshal — failed А>CDCMod — {0000001B-0000-0000-C000-000000000046} — failed А>CDCMod — IUnknown А>CDCMod — IStdMarshalInfo — failed А>CDCMod — IExternalConnection — failed А>CDCMod — IRunnableObject — failed А>CDCMod — IDCMod А>CDCMod — IDCMod А>CDCMod — {1C733A30-2A1C-11CE-ADE5-00AA0044773D} — failed А>CDCMod — IDCMod А>CDCMod — IDCMod А>CComClassFactory — IClassFactory
А>Mojet eto chto-nibud obyasnit,
Довольно малоинформативно. Я так понимаю IDCMod и есть тот интерфейс?
Судя по всему указатель на него нормально создается и освобождается.
Хотя для полной уверенности нужно еще ATL_DEBUG_REFCOUNT продекларировать.
Он покажет счетчик ссылок.
Еще это неплохо прогнать для реальных клиентов. Или смоделировать, на тестовых клиентах,
одновременный вызов.
>- серверный объект создается новый, при новом подключении, или используется >один и тотже экземпляр? >mne ochen interesno. Kakaya raznica? I kak eto viyasnit. Ya dumal raz u tebya exe-com service to vseqda odin i >tot je ekzemplyar. Ili ya oshibayus?
Я хотел узнать singleton он или нет. Это зависит от фабрики класса.
Чтобы в ATL сделать такой объект достаточно в определении класса добавить
DECLARE_CLASSFACTORY_SINGLETON(CYourClass)
Разница в том, что объект не будет каждый раз создаваться заново и разрушаться для каждого клиента,
а будет использоваться один и тотже. Т.е. много лишних действий выполняться не будут.
Если объект обеспечивает только доступ к общему хранилищу и не хранит данных специфичных для клиента,
то это имеет смысл.
ICQ #311116826
Re[12]: ochen interesnaya problema s COM + Service
От:
Аноним
Дата:
21.06.02 16:00
Оценка:
Na vopros > серверный объект создается новый, при новом подключении, или используется >один и тотже экземпляр?
Ya otvetil odin. Seychas stalo ponyatno chto imeli v vidu. Toqda ya izvinyayus, on ne byl singletonom. Xotya ya seychas peredelal yeqo na sinqletona, i oshibka povtoryayetsya xotya i reje. Seychas ya poprobuyu _ATL_DEBUG_REFCOUNT i soobshu o rezultatax.
No moqu skazat odno. Bolshoye, bolshoye spasibo. Vy mne i tak ochen pomoqli.
Re[13]: ochen interesnaya problema s COM + Service
H>First-chance exception in DCCO.exe (NTDLL.DLL): 0xC0000005: Access Violation. H>First-chance exception in DCCO.exe (KERNEL32.DLL): 0x80010105: (no name).
Это совсем не здоровая вещь. Надо разобраться какие системные вызовы делал.
Может поможет полная перекомпиляция.
Счетчик ссылок с этом классе CDCMod все время увеличивается. Т.е. возростает, а
затем убывает, сначала убывал до двух, потом стал до трех. Какойто клиент ссылку
зажрал
ICQ #311116826
Re[15]: ochen interesnaya problema s COM + Service
От:
Аноним
Дата:
25.06.02 10:23
Оценка:
H>>First-chance exception in DCCO.exe (NTDLL.DLL): 0xC0000005: Access Violation. H>>First-chance exception in DCCO.exe (KERNEL32.DLL): 0x80010105: (no name).
МА>Это совсем не здоровая вещь. Надо разобраться какие системные вызовы делал. :)) МА>Может поможет полная перекомпиляция. МА>Счетчик ссылок с этом классе CDCMod все время увеличивается. Т.е. возростает, а МА>затем убывает, сначала убывал до двух, потом стал до трех. Какойто клиент ссылку МА>зажрал :)
Da, vot eto i stranno. Eti kliyenty testoviye, ix pisal ya. i ya vsye vremya podklyuchayus i otklyuchayus, vsye po pravilam. Kak on mojet zajrat ssylku. Nu navernoye koqda mnoqo vyzovov proisxodyashix odnovremenno odin iz releasov mojet provalitsya. No chto toqda mojno sdelat. nelzya li, chto libo sdelat na servere, chtoby on sam otklyuchal posle nekotoroqo timeouta. I voobshe iz-za cheqo eto mojet proisxodit? ochen nezdorovaya situaciya, ya soqlasen. Polnaya perekomiplyaciya toje vryad li pomojet. No ya sdelayu.
Здравствуйте Аноним, Вы писали:
H>>>First-chance exception in DCCO.exe (KERNEL32.DLL): 0x80010105: (no name).
Я тут поискал по коду ошибкию. 0x80010105 означает, что при вызове метода сервера
внутри него возникло C++ исключение (throw(...)), есть еще пара причин, но
эта мне показалась более вероятной. Так что надо проверить код сервера на корректную
обработку исключений С++.
А>Eti kliyenty testoviye, ix pisal ya. i ya vsye vremya podklyuchayus i otklyuchayus, vsye po pravilam. Kak on mojet zajrat ssylku. Nu navernoye koqda mnoqo vyzovov proisxodyashix odnovremenno odin iz releasov mojet provalitsya. No chto toqda mojno sdelat. nelzya li, chto libo sdelat na servere, chtoby on sam otklyuchal posle nekotoroqo timeouta. I voobshe iz-za cheqo eto mojet proisxodit? ochen nezdorovaya situaciya, ya soqlasen. Polnaya perekomiplyaciya toje vryad li pomojet. No ya sdelayu.
А>Chto mojno sdelat, chto mojet byt prichinoy, ili kak mojno nayti etu qadost.
А>Spasibo yeshe raz.
Если клиенты тестовые и просты по своей структуре и функциональности, то причина скорее всего в сервере.
Вызов Release() врятли провалится. Там обычно очень простой код (чем проще тем надежнее). Скорее всего
до него дело не дошло. Умершие ссылки на сервере не отключишь
Вообще само по себе увеличение счетчика влияет лишь на то, что сервер будет "жить вечно"
Но мало ли что там еще задето. Это тебе виднее
По поводу полной перекомпиляции, так мне удавалось лечить странные ошибки (падения сервера) при
генерации евентов клиенту. При этом я пользовался кодом сгенерированным мастером.