Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

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

  • 8 odgovora
  • 4.007 pregleda

Najnovija ↓

C# i C++ COM komponenta - problem blokiranja metoda 18.09.2007. u 13:51 · pre 232 meseca #1
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?
Potpis
Samo se budala saplice na kamen iza sebe.
Re: C# i C++ COM komponenta - problem blokiranja metoda 18.09.2007. u 14:09 · pre 232 meseca #2
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 ....
Potpis
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.
Re: C# i C++ COM komponenta - problem blokiranja metoda 18.09.2007. u 14:58 · pre 232 meseca #3
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.
Potpis
Samo se budala saplice na kamen iza sebe.
Re: C# i C++ COM komponenta - problem blokiranja metoda 18.09.2007. u 19:57 · pre 232 meseca #4
Jel COM deo zaista COM objekat ili je DCOM serverska komponenta koja radi u svom procesu?
Potpis
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ć
Re: C# i C++ COM komponenta - problem blokiranja metoda 18.09.2007. u 22:43 · pre 232 meseca #5
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.
Potpis
Samo se budala saplice na kamen iza sebe.
Re: C# i C++ COM komponenta - problem blokiranja metoda 19.09.2007. u 11:49 · pre 232 meseca #6
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.

Potpis
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ć
Re: C# i C++ COM komponenta - problem blokiranja metoda 19.09.2007. u 17:11 · pre 232 meseca
izmenjeno 1 put, poslednji put erkan 19.09.2007. u 23:09
  1. erkan19.09.2007. u 23:09zapis iz teksta poruke
#7
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.
Potpis
Samo se budala saplice na kamen iza sebe.
Re: C# i C++ COM komponenta - problem blokiranja metoda 20.09.2007. u 11:13 · pre 232 meseca #8
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)
Potpis
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ć
Re: C# i C++ COM komponenta - problem blokiranja metoda 20.09.2007. u 14:46 · pre 232 meseca #9
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 :)
Potpis
Samo se budala saplice na kamen iza sebe.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme