Végülis üzenetküldözgetés lett a megoldás. Mert a tapasztalat az volt, hogy a másik objektumba való hívás (ha az másik szálon él) hazavágja a szálak által kapott lehetoségeket (amíg nem végez a fgv., olyan, mintha 1 szál lenne :( )...
Szóval üzenetek dögivel. Így már az OLE sem gáz... Csak macerás kasztolgatni + minden...
Egy processzen belul a szalak kozott kommunikalni tudsz (osztott)valtozokkal is, nem kell msg-ket kuldozgetned, csak szinkronizald.
SendMsg, PostMsg teljesen eltero, az elobbi kozvetlenul hiv az utobbi msg queue-ba rak.
OLE-hez nem ertek, de javaslom az MSDN doksikat.Tobbszalu mukodeshez elkepzelheto hogy mashogy kell letrehoznod az objektumokat.Esetleg mas dll-lel kell linkelned.
Szerintem az az alapveto problema hogy ket vagy tobb szal ugyanazt az objektumot akarja egy idoben ill. atlapolva hasznalni. Ez nem szerencses mint lattad. Probalkozz szemaforos eleressel, vagy spinlock-kal.
Hát ennyire nem merültem bele a Windowsba...
Valószímu ezt fogom tenni (+1 szál az OLE-nak + üzengetosdi)... Más probláma is felmerült, ami üzenetesdivel kiküszöbölheto...
Szóval PostThreadMessage lesz a sláger a cuccomban :)) Majd gyártok egy fasza ideológiát, miért ez a frankó (a diplomamunkámba kell :)) )
Na várjunk csak a SendMessage az tulajdonképpen szubrutinhívást jelent, azaz megvárja hogy a hívott ledolgozzon...
Szerintem a te esetedben kellene egy "OLE-szerver-szál" aki (általában) tétlenül várja az üzeneteket, és egy vagy több kliens szál, aki kéréseket küld (PostMessage) ennek a szervernek.
Másik kérdés, hogy kell-e a szervernek nyugtát küldenie a klienseknek, ha sikerült egy-egy feladatot elvégeznie...
Köszi a reagálásokat, úgy fest más nem nagyon tud/akar szólni :(
Rosszul fogalmaztam. Az a gond, hogy kultúráltan a PostThreadMessage az, ami müxik. De ez csak akkor lesz hatással a fogadóra, mikor megnézi, van-e üzenet. Azt figyeltem meg, hogy a SendMessage és a PostMessage eléggé eltérő futásidőt eredményez.
A szívásom ott van, hogy egy modemes cuccon kell pontosan hibaarány mellett késleltetést is mérni. Namost a PostMessage miatt nem pontos a triggerelés szerintem. Vagyis, ha jól sejtem pl. az UI terheltsége miatt pl.később néz rá az objektum az üzenetekre... Ez meg egy nem determinisztikus hibát ad a mérésemhez :(((
Ezért kéne rájönni, hogy mi a titka a szálak közötti objektum hívásnak. Valahol ott van a kutya elásva, hogy vannak bizonyos MFC objektumok, amik nem oszthatók meg szálak között. pl. CWnd-ből származtatottak esetén... De, hogy pl. az Excel esetében mit tehetnék...
Na ezt eltoltam... nem objekum-orientált objektumokra gondoltam, amik tényleg a közös memóriában vannak, hanem op.rendszer szintű objektumokra, mint fájlok, socketek stb...
Úgy megy a dolog, ha üzeneteket küldözgetek az OLE objektumot létrehozó szálnak, de lassú :(( Ne má... saját programon belül egy üzenetküldés/fogadás nem lassíthat mérhetően... vagy tévedek...
Amit mondasz így nem állja meg a helyét!
Már csak azért sem, mert elvben ugye ugyan azt a memóriát használják. A saját objektumaimat halál lazán elérem, mármint más szálakból. Vagyis pl a portra író szál frankón használja a fő szál objektumait + az olvasó szál az író objektumaiba is hívogat és müxik!
A gáz egyedül az OLE objektummal van :(((
Az a legnagyobb gond, hogy gyorsnak kellene lenni az adatátvitelnek az OLE "linken" át. Úgy megy a dolog, ha üzeneteket küldözgetek az OLE objektumot létrehozó szálnak, de lassú :((
Semmit sem értek ehhez a rendszerhez, de szerintem amit akarsz az filozófialiag lehetetlen: ha már szétágazott a programod szálakra, akkor az egyes szálak által léterhozott objektumok nem közösek.
Egy nekem nagy probléma megoldásában kérném a hozzáértők segítségét.
VisualStudio 6.0-ával írok egy MFC alkalmazást.
A program több szálon fut (sorosport kezelés 2 szál + a fő szál). Az Excel-t + Chart-ot kellene OLE automation-nal meghajtanom.
A gond a következő:
- ha a fő szálban létrehozok egy Excel OLE objektumot, működik szépen.
- irok ügyes kis függvényeket, szépen használják az előbbi objektumot.
-DE!! Ha egy másik szálból hívok egy fentebbi ügyes kis függvényt, szétszáll a program. Hol az MFC dll, hol a kernel, hol az msvcrt dll-ben :((((
Namost, ha abban a szálban hozom létre az objektumot, működik...
KÉRDÉS: Mit kell tenni, hogy az egyik szálban létrehozott OLE objektumot a másik szálból használhassam?
Lécci, aki tud segítsen, mert fontos lenne!!!
Előre is köszi!