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

COM reference counting

[es] :: C/C++ programiranje :: COM reference counting

[ Pregleda: 1924 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
93.86.55.*

ICQ: 208550327


+14 Profil

icon COM reference counting11.09.2008. u 16:52 - pre 190 meseci
Postoji jedna stvar kod mehanizma reference countera koja, za sada, za mene predstavlja misteriju.

Posto radim u DirectX-u, uzecu primer objekata iz tog API-ja mada je verovatno sve isto kao i kod drugih COM objekata.

Code:

IDirect3DDevice9 * pDevice1;   // smatrajte da je ovaj objekat inicijalizovan u 'prethodnom delu koda'
IDirect3DDevice9 * pDevice2 = NULL;

pDevice2 = pDevice1;



Nikako ne mogu da provalim sta se desava.

Da li operator jednako ( ovo su, ipak, pointeri tako da sumnjam ) uvecava ref. counter za 1?

Video sam neki primer gde se samo ovako radi a i drugi koji izgleda ovako:

Code:

IDirect3DDevice9 * pDevice1;   // smatrajte da je ovaj objekat inicijalizovan u 'prethodnom delu koda'
IDirect3DDevice9 * pDevice2 = NULL;

pDevice2 = pDevice1;
pDevice1->AddRef();

.
.
.

pDevice2->Release();



Sta se ovde desava i sta je pravo resenje?
EOF
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: COM reference counting11.09.2008. u 17:13 - pre 190 meseci
Ne povecava automatski, mada postoji ATL wrapper koji to moze da odradi za tebe (CComPtr<T>)

Neko koser resenje je da kad god napravis kopiju interfejsa pozoves AddRef() nad novim pointerom i Release() kad zavrsis sa njim, cisto zbog svoje preglednosti koda. Posto je pDevice1 == pDevice2, sve jedno je "ciji" AddRef() pozoves posto oba pokazuju na isti COM objekat. Dok god pazis na scope i osiguras se da za svaki AddRef() ide jedan Release() i da kad refcnt dodje na 0 nemas "zivih" pointera, sve je ok
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

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
200.49.157.*

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: COM reference counting11.09.2008. u 17:18 - pre 190 meseci
Citat:
glorius: Postoji jedna stvar kod mehanizma reference countera koja, za sada, za mene predstavlja misteriju.

Posto radim u DirectX-u, uzecu primer objekata iz tog API-ja mada je verovatno sve isto kao i kod drugih COM objekata.

Code:

IDirect3DDevice9 * pDevice1;   // smatrajte da je ovaj objekat inicijalizovan u 'prethodnom delu koda'
IDirect3DDevice9 * pDevice2 = NULL;

pDevice2 = pDevice1;



Nikako ne mogu da provalim sta se desava.

Da li operator jednako ( ovo su, ipak, pointeri tako da sumnjam ) uvecava ref. counter za 1?


Ne. Ovo jesu samo obicni pointeri. Da bi dobio automatiku za automatsko povecavanje referenci treba da koristis neke od refcounted com pointer klasa. Na primer _com_ptr_t.

Citat:
glorius:
Video sam neki primer gde se samo ovako radi a i drugi koji izgleda ovako:

Code:

IDirect3DDevice9 * pDevice1;   // smatrajte da je ovaj objekat inicijalizovan u 'prethodnom delu koda'
IDirect3DDevice9 * pDevice2 = NULL;

pDevice2 = pDevice1;
pDevice1->AddRef();

.
.
.

pDevice2->Release();



Sta se ovde desava i sta je pravo resenje?


Nema ovde pravog ili pogresnog resenja. Sve zavisi sta se zeli postici. Dodavanje referenci na com pointer implicira da dati proces zeli da se osigura u validnost pointera tokom njegovog koriscenja.

Kada se instancira bilo koji com interfejs on automatski ima refcount 1. Posto je moguce da se jedna te ista instanca com interfejsa koristi u razlicitim mestima u nekom programu pa cak i u razlicitim threadovima jedini nacin da se garantuje validnost ovog objekta je da se uvecava refcount. Refcount pokazuje na koliko "mesta" se trenutno koristi instanca objekta. To takodje znaci da dok je refcount > 0 interfejs ce biti validan.





Tko leti vrijedi
 
Odgovor na temu

[es] :: C/C++ programiranje :: COM reference counting

[ Pregleda: 1924 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

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