PDA

Visualizza la versione completa : Fare la Share Memory in C++


Paolo1985
17-10-2008, 11:08
Ciao a tutti io ho un software fatto in C++ Borland 5, adesso avrei bosigno di implementare la Share Memory nel programma, ho cercato in giro per internet ma non ho visto esempi e spiegazioni chiare...

Qualcuno mi sa dare un esempio chiaro di un programma che gestisca la share memory?

Grazie Ciao....

oregon
17-10-2008, 13:51
Che intendi con "share memory"?

Parla un po' di piu' del tuo progetto, problema altrimenti gli equivoci possono essere mille ...

Paolo1985
17-10-2008, 14:25
Shared Mamory!!!!!

Condivisione della Area di memoria tra due programmi, nel mio caso ho un software sviluppato da me che per motivi vari ho bisogno che condivida lo stesso spazio di memoria.

il mio programma deve essere aperto due volte ma putano su un unico spazio di memoria, ho visto in gire per internet qualche esempio ma non sono chiari....
Ho letto che dovrei usare funzioni del tipo

- void *calloc(size_t size)
- void *malloc(size_t size)
- void *realloc(void *ptr, size_t size)
- void free(void *ptr)

oregon
17-10-2008, 14:58
Originariamente inviato da Paolo1985
Shared Mamory!!!!! ...

A parte che avevi scritto "share memory", il problema e' che, detto cosi', non ha molto significato ... devi indicare il "contesto" dell'uso della shared memory, sistema operativo impiegato, ambiente, tipo di applicazioni e piu' ne hai piu' ne metti di indicazioni !

Caiodark
17-10-2008, 15:42
Originariamente inviato da Paolo1985
Shared Mamory!!!!!

Condivisione della Area di memoria tra due programmi, nel mio caso ho un software sviluppato da me che per motivi vari ho bisogno che condivida lo stesso spazio di memoria.
il mio programma deve essere aperto due volte ma putano su un unico spazio di memoria,

Quindi devi mettere in piedi un canale di comunicazione tra due istanze dello stesso programma che lanci. Le soluzioni sono molteplici e dipendono dal sistema operativo su cui gira il programma.



ho visto in gire per internet qualche esempio ma non sono chiari....
Ho letto che dovrei usare funzioni del tipo

- void *calloc(size_t size)
- void *malloc(size_t size)
- void *realloc(void *ptr, size_t size)
- void free(void *ptr)

Sono funzioni di allocazione di memoria in C.
Direi che una letta qui (http://en.wikipedia.org/wiki/Inter-process_communication) sarebbe illuminante per te.

oregon
17-10-2008, 16:29
Originariamente inviato da Caiodark
Quindi devi mettere in piedi un canale di comunicazione tra due istanze dello stesso programma che lanci.

E non e' detto che la shared memory sia il modo piu' appropriato ...

Paolo1985
27-10-2008, 09:55
Grazioe per il Link ma non ho trovato le cose che ho bisogno...

Ripeto il mio problema, ho un programma che deve essere aperto 2 volte ma usando gli stessi dati in memoria, non voglio mettere la gestione dei soket perchè il programma diventerebbe super pesante, e quindi utilizzando la share memory e la cosa + appropriata.
Quello che voglio se scrivio un testo in una text box nel programma A, voglio che si veda anche sul programma B (identico al A).

Qua sotto c'è il codice di esempio sulla Main Form (in C++ Builder 5):

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
AnsiString sIniFileName, m_sWorkingDir, sMutex;
TIniFile *IniFile;
int nSet;

m_sWorkingDir = ExtractFilePath(Application->ExeName);

sIniFileName = m_sWorkingDir + "PrtSharedMemory.ini";//TruncateAnsiString( Application->ExeName.UpperCase(), ".EXE" ) + ".INI";
IniFile = new TIniFile( sIniFileName );
nSet = IniFile->ReadInteger( "GENERAL", "Set", 0 );
delete IniFile;
sMutex.printf( "APPLICAZ%d", nSet );

HANDLE mutex = CreateMutex( NULL, TRUE, sMutex.c_str() );

if( GetLastError()!=ERROR_ALREADY_EXISTS )
{
try
{
static HANDLE shFileMap = NULL;
HANDLE hBaseAddress;

if(!nSet)
shFileMap = CreateFileMapping((HANDLE)0xffffffff, NULL, PAGE_READWRITE, 0, 4, "AppBCB");
else
shFileMap = OpenFileMapping( FILE_MAP_ALL_ACCESS, TRUE, "AppBCB" );

if( shFileMap==NULL )
{
ShowMessage("Il programma server non e Aperto.");
Application->Terminate();
}
else
{
hBaseAddress = MapViewOfFile( shFileMap, FILE_MAP_WRITE, 0, 0, 0 );

Application->Initialize();
Application->CreateForm(__classid(TPrtSharedMemoryForm), &PrtSharedMemoryForm);
Application->Run();
}
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
CloseHandle( mutex );
return 0;
}

Quando creo la variabile hBaseAddress non so come allocarla alla form in modo che quando si apre il programma, me lo carichi dove voglio io, ma non so quali parametri devo mettere ho cercato in internet ma non ci sono molti esempi in c++ builder 5.....

MItaly
27-10-2008, 14:49
http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx

oregon
27-10-2008, 15:17
Originariamente inviato da Paolo1985
Quando creo la variabile hBaseAddress non so come allocarla alla form in modo che quando si apre il programma, me lo carichi dove voglio io

Ma che vuoi dire?

Paolo1985
27-10-2008, 15:54
Che quando avvio il programma, il compilatore crea uno spazio di memoria dove vuole lui, io avrei bisogno per il sharing memory sapere l'indirizzo del programma aperto in memoria in modo da mapparlo e fare in modo che l'altro programma trovi lo spazio condiviso

Loading