Toon posts:

[win32/c++] Memory sharen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een programma in C, welke gegevens moet doorsturen naar een tweede programma, welke in C++ gemaakt wordt. Nou moet er een stuk geheugen door beide programma's gebruikt kunnen worden (programma 1 wijzigt constant de gegevens in de geheugenruimte, programma 2 leest deze periodiek uit).

Nou is het niet mogelijk om mutexes te gebruiken aangezien het eerste programma geen MFC-functies kan aanroepen. En een verbinding via een socket naar programma 2 openen is ook geen optie, omdat arrays van variabele lengte overgestuurd moeten worden en ik in één keer uit wil lezen wat de gegevens op dat moment zijn.

Ik heb geen idee hoe ik dit kan oplossen. Het enige wat ik heb gevonden waren mutexen maar dit is niet mogelijk.

Verwijderd

Topicstarter
Bedankt maar die gebruiken dus ook MFC en dat lukt met het eerste programma helaas niet

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Wat er op die webpagina staat is gewoon Windows C, wat != MFC is. Ik neem aan dat je bedoelt dat er geen Windows specifieke functies gebruikt kunnen/mogen worden. Als dat inderdaad zo is, dan is het wat lastig. De enige echt platform-onafhankelijke/niet-Windows manier die ik dan kan bedenken is programma 1 het geheugen in een file laten gooien, die programma 2 dan uitleest. Dit is op zich niet zo netjes, maar ik weet uit ervaring dat het op zich best werkt. Voor de nettere oplossingen kom je denk ik altijd wel op iets Windows-achtig uit, zoals Yarvieh al voorstelde...

Verwijderd

Topicstarter
Ok sorry ik dacht dat het onder MFC viel maar ik bedoelde dus dat het geen windows specifieke functies mochten zijn. Jammer dat het niet werkt, die file lijkt me niet de beste oplossing aangezien er misschien wel fouten op zouden kunnen treden als er direct gelezen en geschreven wordt.

Ik ben nu aan het proberen om de gegevens via een DLL door te sturen, op die manier kun je ook deels geheugen sharen. In ieder geval bedankt voor de hulp!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Ey, ten eerste zijn DLLs ook Windows-specifiek en ten tweede is onder Win32 DLL-geheugen ook niet geshared.

Wat het tweede betreft, als je met shared memory kan werken heb je dus een bovenlimiet op geheugengebruik. Stamp die array in een UDP pakketje en gooi dat via een socket over.
Bekijk aan de andere kant de packet grootte en je bent er.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Redelijk portable en retesnel en bedoeld om tussen 2 gerelateerde apps te communiceren zijn anonymous pipes. Portable richting Linux/Unix/Win32/BeOS/VAX/VMS.

* curry684 blijft erbij dat sockets te langzaam zijn en overkill voor localhost connecties, en nee daar hoeven we geen nieuwe discussie over te beginnen ;)

Professionele website nodig?


Verwijderd

MSalters schreef op 17 June 2003 @ 22:41:
Ey, ten eerste zijn DLLs ook Windows-specifiek en ten tweede is onder Win32 DLL-geheugen ook niet geshared.
Standaard niet,maar je kan 'n datasegment sharen met alle apps die de dll gebruiken, precies weet ik 'm niet meer, maar weet wel dat oisyn ooit eens uitgezocht heeft...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja klopt, je kunt met VC++ sections definieren, waar je vervolgens variabelen en code in kunt zetten. Deze sections kun je de SHARED flag meegeven, zodat er 1 blok fysiek geheugen wordt gebruikt voor alle instanties van de executable of dll

De code heb ik thuis nog wel, ik zal het eens posten

.edit: http://msdn.microsoft.com...ang/html/vcrefSection.asp

De code was ongeveer zoiets:
C++:
1
2
3
4
5
6
7
8
// definieer een shared section voor lezen en schrijven
#pragma section ("shsec", read, write, shared)

// declareer een variabele in die section
__declspec (allocate ("shsec")) int sharedInt;

// definieer de variabele
int sharedInt = 0;


als je dit in een DLL zet, dan werkt elk proces dat van de dll gebruik maakt met dezelfde sharedInt. Als het ene proces 'm wijzigt dan is dat dus ook te merken in het andere proces.

Er zaten geloof ik wel wat haken en ogen aan. Zo moet de DLL altijd op een vast adres in de process worden geladen volgens mij

[ Voor 56% gewijzigd door .oisyn op 18-06-2003 11:47 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

@ oisyn + yarvieh: als Win32 shared memory al niet portable genoeg is zou ik helemaal geen code gebruiken op basis van die feature die niet eens door de andere grote Windows-compiler (BCB) op dezelfde manier ondersteund wordt :)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Niet door borland ondersteund? Ok, misschien niet in deze vorm, maar het is natuurlijk wel een feature van het Win32-PE formaat. Ik heb geen ervaring met Borland, maar heeft die ook geen optie om een bepaalde var in een andere section te declareren?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

D'r is wel zoiets maar de pragma is anders (pragma's zijn tussen MSVC en Borland zelden uitwisselbaar, logisch overigens).

Professionele website nodig?

Pagina: 1