[ reiser @ 16.11.2011. 11:49 ] @
Napisao sam klasu za IPC preko shared memory objekata, elem, zanima me da li sam dobro odradio sinhronizaciju, tj locking ? (nesto mislim da nisam, jer mi je ovo prvi put da radim sa ovim stvarima)

Source code klase

Moja ideja je da imam dva eventa (FHSignal1 i FHSignal2), koji ce se naizmenicno setovati. Komunikacija se odvija izmedju dva ista procesa, dakle isti kod treba da obavlja i citanje i pisanje po shared objektu. Tako da sam ja zamislio ovu stvar tako da se u glavnom procesu pokrene listener thread (TSignalListenerThread) koji ceka na podatke, a svi ostali procesi samo pisu po shared objektu.

Kod nije toliko komplikovan, neko ko se vec bavio ovim stvarima moze lako da vidi sta se desava, tako da necu da ulazim u objasnjavanje kako sta radi jer mogu samo da zbunim nekoga. Naizgled sve radi, ali me zanima da li postoje flaw-ovi u sync mehanizmu. Trenutno samo u WriteString() setujem evente, tj "lockujem".
[ savkic @ 17.11.2011. 19:38 ] @
> Kod nije toliko komplikovan, neko ko se vec bavio ovim stvarima moze lako da vidi sta se desava, tako da necu da ulazim u objasnjavanje kako sta radi jer mogu
> samo da zbunim nekoga. Naizgled sve radi, ali me zanima da li postoje flaw-ovi u sync mehanizmu. Trenutno samo u WriteString() setujem evente, tj "lockujem".

Iz koda mi nije jasno kako si realizovao sinhronizaciju upisa i čitanja stringova, dok jedan čita da drugi ne upisuje i obratno. Sam sistem sa eventima za obaveštavanje da ima novih poruka je, koliko vidim, u redu. Nema potrebe da stalno mapiraš i demapiraš (MapViewOfFile i UnmapViewOfFile), dovoljno je to jednom uraditi. Za sinhronizaciju sa glavnim threadom ima i boljih rešenja, poput PostMessage.
[ reiser @ 18.11.2011. 14:28 ] @
Message koji mi je potreban (WM_COPYDATA) ne moze da se koristi sa bilo kojom async messsage funkcijom (PostMessage, SendNotifyMessage, SendMessageCallback), tako da sam tu primoran da koristim blocking SendMessage(), sto mi ne odgovara.

Sinhronizacija read/write je odradjena tako sto thread koji cita na pocetku setuje FHSignal1 i ceka na FHSignal2. WriteString() pre pisanja proverava da li je FHSignal1 u signaled stejtu pomocu WaitForSingleObject() - ovo automatski setuje FHSignal1 u non signaled state, sto onemogucava drugu instancu WriteString() da upisuje. Zatim se po zavrsetku upisa FHSignal2 signaluje, sto threadu kaze da moze da pocne da cita. Tokom citanja, FHSignal1 je i dalje non signaled, dakle upis je onemogucen, sve dok thread ne zavrsi sa citanjem. Kada thread zavrsi sa citanjem, egzekucija se vraca na pocetak repeat petlje, i tu se FHSignal1 setuje u signaled state opet i ceka na FHSignal2, tj novi upis.