Komunikácia zdieľanej pamäte medzi procesmi v C #

C Shared Memory Communication Between Processes



2.1 Trvalé súbory namapované v pamäti

Vytvorte súbor namapovaný na pamäť so zadaným bežným názvom na základe existujúceho súboru

obrázok
 using (var mmf = MemoryMappedFile.CreateFromFile(@'c: memory mapped file.data',FileMode.Open, 'Common name')) { //Create a memory-mapped file view server with the specified offset and size using (var accessor = mmf.CreateViewAccessor(offset, length)) //Offset, can control the memory location of data storage size, used to control the space occupied by storage  { //Marshal provides a set of methods for allocating unmanaged memory, copying unmanaged memory blocks, converting managed types to unmanaged types, and other miscellaneous methods used when interacting with unmanaged code. int size = Marshal.SizeOf(typeof(char)) //Modify the memory map file view for (long i = 0 i  size) { char c= accessor.ReadChar(i) accessor.Write(i, ref c) } } } //Another process or thread can open an existing memory mapped file with the specified name in the system memory using (var mmf = MemoryMappedFile.OpenExisting('Common name')) { using (var accessor = mmf.CreateViewAccessor(4000000, 2000000)) { int size = Marshal.SizeOf(typeof(char)) for (long i = 0 i  size) { char c = accessor.ReadChar(i) accessor.Write(i, ref c) } } } 
obrázok

2.2 Nepermanentné súbory namapované v pamäti

Pamäť mapované súbory, ktoré nie sú mapované na existujúce súbory na disku



obrázok
 using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew('testmap', 10000)) { bool mutexCreated //Inter-process synchronization Mutex mutex = newMutex(true, 'testmapmutex', out mutexCreated) using (var stream = mmf.CreateViewStream()) //Create file memory view stream stream-based operation  { var writer = newBinaryWriter(stream) writer.Write(1) } mutex.ReleaseMutex() Console.WriteLine('Start Process B and press ENTER to continue.') Console.ReadLine() mutex.WaitOne() using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { var reader = newBinaryReader(stream) Console.WriteLine('Process A says: {0}', reader.ReadBoolean()) Console.WriteLine('Process B says: {0}', reader.ReadBoolean()) } mutex.ReleaseMutex() } using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting('testmap')) { Mutex mutex = Mutex.OpenExisting('testmapmutex') mutex.WaitOne() using (var stream = mmf.CreateViewStream(1, 0))//Note the offset here  { var writer = newBinaryWriter(stream) writer.Write(0) } mutex.ReleaseMutex() }
obrázok

2.3 Vyplňte DEMO

Príklad trvalej komunikácie so zdieľanou pamäťou C #, pri komunikácii nie je problém s riadením vlákien a procesov. Nasleduje implementovaný kód.



Najskôr spustite službu správ IMServer_Message,



Reštartujte štátnu službu IMServer_State,

IMServer_Message Zadajte raz (vytvorte spoločný názov zdieľanej pamäte a spoločné uzamknutie vlákna a zapíšte zdieľanú pamäť do režimu zobrazenia streamu),

Raz zadajte IMServer_State (získajte zdieľanú pamäť a píšte v režime zobrazenia streamu, pozrite si typ štruktúry prístupu prístupového objektu)



A okamžite znova zadajte IMServer_Message (prečítajte si práve napísanú správu),

Sledujte zmeny na obrazovke IMServer_State a počkajte (uzamknutie vlákna) asi 5 s (uzamknutie vlákna je uvoľnené)

Sledujte displej na IMServer_Message (zobrazte práve napísanú správu do zdieľanej pamäte)

IMServer_Message.exe Zákonníka

Zobraziť kód

IMServer_State.exe Zákonníka

Zobraziť kód

2.4 Prípad synchronizácie viacerých vlákien a zdieľania údajov

V tomto projekte sú uvedené dva príklady. Prvý príklad je v priečinku DEMO. Je to viacprocesová synchronizačná technológia. Malo by to byť spustené hlavnou funkciou. Druhý príklad môže priamo otvoriť projekt a spustiť ho na zdieľanie dát z pamäte pre viac procesov. Technológia zdieľania a synchronizácie využíva semafory.

odkaz na stiahnutie: MultiProcess.rar

Vitajte pri komentovaní a vylepšovaní programu, ak vám to pomôže, prosím lajknite :).

Referenčný článok

Komunikácia zdieľanej pamäte medzi procesmi v C #








Tento článok je prenesený z blogu záhradných blogov wenglabs, pôvodného odkazu: http://www.cnblogs.com/arxive/p/7222185.html, Ak potrebujete dotlač, kontaktujte pôvodného autora