Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

C# i C++ COM komponenta - problem blokiranja metoda

[es] :: .NET :: .NET Desktop razvoj :: C# i C++ COM komponenta - problem blokiranja metoda

[ Pregleda: 2988 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

erkan
Sarajevo

Član broj: 12339
Poruke: 267
*.team.ba.

ICQ: 238530669


Profil

icon C# i C++ COM komponenta - problem blokiranja metoda18.09.2007. u 12:51 - pre 201 meseci
Pozdrav,

imam jedan problem. Naime, u C# aplikaciji koristim neku C++ COM componentu.
Sve to radi divno dok ne dodje do ukrstanja. Pozovem neki method COM komponente
a istovremeno dok pozivam taj metod COM komp. ispali neki event (koji u C# aplikaciji hvatam)
i u tom slucaju metod koji sam pozvao zablokira i nikada ne izadje iz njega.

Sada mi nije bas jasno, kako se to desava obzirom da ako bih COM koristio iz C++ koda
tada bih trebao koristiti CoInitializeEx(NULL, COINIT_MULTITHREADED)
da bih dozvolio ovakve stvari (ukrstanja), medjutim, u C#-u jednostavno referenciram
COM komponentu sa AddReferences.

Ima li ko ideju kako da rijesim ovu stvar?
Samo se budala saplice na kamen iza sebe.
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.ptt.yu.

Sajt: www.mika.rs


+6 Profil

icon Re: C# i C++ COM komponenta - problem blokiranja metoda18.09.2007. u 13:09 - pre 201 meseci
Tja, cudno .... Je'l si probao da stavis da se tvoja aplikacija izvrsava u Multithreaded apartment rezimu ? To ti je atribut iznad Main metode, po defaultu je STAThread, prebaci na MTAThread. Ali, nesto sumnjam da je u tome problem ....
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

erkan
Sarajevo

Član broj: 12339
Poruke: 267
*.team.ba.

ICQ: 238530669


Profil

icon Re: C# i C++ COM komponenta - problem blokiranja metoda18.09.2007. u 13:58 - pre 201 meseci
ma, ono sto nisam rekao jer mislim da je nebitno je da u stvari moja aplikacija i nije aplikacija vec
je to .NET COM komponeneta koja se dalje poziva od strane neke aplikacije.. mada mislim
da to ne mjenja stvar.
Samo se budala saplice na kamen iza sebe.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: C# i C++ COM komponenta - problem blokiranja metoda18.09.2007. u 18:57 - pre 201 meseci
Jel COM deo zaista COM objekat ili je DCOM serverska komponenta koja radi u svom procesu?
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

erkan
Sarajevo

Član broj: 12339
Poruke: 267
*.PPPoE-5077.sa.bih.net.ba.

ICQ: 238530669


Profil

icon Re: C# i C++ COM komponenta - problem blokiranja metoda18.09.2007. u 21:43 - pre 201 meseci
bas COM :).
Samo da jos dodam:
isti sam problem imao prije par mjeseci, i koliko se sjecam
isti sam COM koristio iz drugog .NET DLL-a a taj ,NET DLL je opet koristen
iz trece testne win aplikacije i pozivao sam funkcije tog dll-a iz vise tredova i
isti problem sam izazvao. Tako sam skontao da je multithreading bio problem i
samo sam sveo na jedan thread i radilo je. Medjutim, sada nema vise
threadova a problem isti.
Samo se budala saplice na kamen iza sebe.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: C# i C++ COM komponenta - problem blokiranja metoda19.09.2007. u 10:49 - pre 201 meseci
Pazi ovako, .NET interop assembly koji se kreira na AddReference kreira delegate i procesiranje eventa na osnovu event informacija iz type library-a i tu ne bi trebao da bude problem (niti mozes bas mnogo da utices direktno). Problem je verovatno u tome kako je event deklarisan u COM-u nasuprot tome kako se invokuje iz C++ koda. Deluje kao da je neki nestandardni asinhroni callback event koji .NET procesira kroz pooling a posto je pozivni thread usao u COM bude blokiran do procesiranja eventa, sto se ne desi jer se thread ne vrati u .NET kod. Ajd ako ti nije tesko izvuci tlb iz COM-a i okaci ga i daj kod tog C++ metoda koji invokuje event handler.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

erkan
Sarajevo

Član broj: 12339
Poruke: 267
*.team.ba.

ICQ: 238530669


Profil

icon Re: C# i C++ COM komponenta - problem blokiranja metoda19.09.2007. u 16:11 - pre 201 meseci
uh, evo cijeli dan se borim sa ovim COM-om.
Definitivno je problem u sljedecem:
- COM 'eskportuje' masu nekakvih stvari i koristim ga za pristup bazi preko specificnog frameworka (zato i psotoji ovaj COM),
za registraciju na server (aplikacija), za dobijanje informacija o statusu objekata o kojima server brine itd.
Danas sam pokusao debagiranje. Pogledam disassembly i imam situaciju da sve dok se vrti iz jednog threada ok je, cim
krenem pozivanje metoda iz drugog threada javi se problem... dodje do sporne funkcje koja zaglavljuje, udje u nju, odradi
par upisivanja u registre i onda dodje do tacke u kojoj COM funkcija poziva neku drugu funkciju i tu pada. Najcudnije mi
sto ne izbaci exception nego samo tu 'zaglavi'.

Zakljucak: kao da ima problem sa marshalizovanjem (jel moguce?), drugog objasnjenja nemam jer sve bude ok ako jedan tred
odradjuje posao, cim se upetlja neki thread sa strane (iako i taj thread koristi jednu te istu instancu klase koja dalje kominicira sa COMom)
jave s probemi.
Uzas.

Samo da dodem, nije problem da okacim tlb fajl, ali sam za sebe COM ne znaci nista
jer je dio okruzenja koji u sebi integrise jos x dll-ova itd. itd.

[Ovu poruku je menjao erkan dana 19.09.2007. u 23:09 GMT+1]
Samo se budala saplice na kamen iza sebe.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: C# i C++ COM komponenta - problem blokiranja metoda20.09.2007. u 10:13 - pre 201 meseci
Pa znaci da ti nisi ni dosao do pozivanja eventa koji se vraca u C#. Malo si nas zbunio sa time. To sto si ti sad opisao je definitivno thread locking. Ta funkcija koju C++ kod poziva, jel to funkcija iz drugog DLLa, iz tvog C++ koda ili iz drugog COMa? Jel mozes da debagujes i taj kod? U princip COM STA sinhronizacija blokira poziv dok prethodni poziv ne obavi posao. Ovo sto se tebi desava veoma lici na deadlock (metodi A i B su u STA modu i pozivaju jedan drugog, i dva threada jedan u i drugi u B zaglave cekajuci onog drugog da zavrsi)
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

erkan
Sarajevo

Član broj: 12339
Poruke: 267
*.team.ba.

ICQ: 238530669


Profil

icon Re: C# i C++ COM komponenta - problem blokiranja metoda20.09.2007. u 13:46 - pre 201 meseci
ok, da malo detaljisem jos, da opisem komplet environment kod mene.
Java aplikacija treba da pristupi nekom velikom sistemu, nesto kao da
obezbjedi upravljanje nekim elementima u tom sistemu. Odluceno je da se
to radi u Javi.
Sa moje strane ja imam C++ COM komponentu koja je interface prema tom
sistemu. Napravio sam neki wrapper tog COM-a i koristim ga pored ovog
u jos jednom projektu za drugog customer-a.

Isti taj wrapper sada koristim kao interface koji ce Java aplikacija koristtiti
kako bi pristupila sistemu. Kako JAVA ne moze direktno da pristupi
mom.NET dll-u, bio sam prinudjen da napisem jedan .NET COM
koji preko JNI i ostalih cuda prilagodjavanja JAVI (uzas jedan), omogucava
Java aplikaciji da pristupi mom .NET wrapperu, a samim tim i C++ COM-u
sto znaci i sistemu. Sve je to divno i bajno dok iz jave ne krenuse da
koriste pozivanje COM metoda iz vise threadova.
Zadnje sto sam mogao da vidim u logu nakon dva dana smaranja sa ovim jeste
da Java poziva moju wrapper komponentu iz dva threada, prvi thread je STA
a drugi MTA i tu bi trebala biti kvaka.
Znaci, da mi je promjeniti ovaj prvi iz STA u MTA pa da probam.
Moguce da bi to bilo rjesenje problema.
Jesam se ispisao :)
Samo se budala saplice na kamen iza sebe.
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: C# i C++ COM komponenta - problem blokiranja metoda

[ Pregleda: 2988 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.