Shared memory(memoria condivisa)

di il
30 risposte

Shared memory(memoria condivisa)

Ciao a tutti.MI servirebbe un codice in c++ che dato in ingresso una matrice crea una memoria condivisa e salva al suo interno ina matrice.Mi servirebbe unche un altra funzione che invece riesca a leggere tale matrice.GRAZIE!!!VI PREGO DI POTERMI POSTARE UNO SCRIPT XKé é IMPORTANTISSIMO!!!

30 Risposte

  • Re: Shared memory(memoria condivisa)



    Per pura informazione: IN C++ NON ESITONO GLI SCRIPT.
  • Re: Shared memory(memoria condivisa)

    Ciao grazie, ho creato i 2 programmi come da te indicato;
    Volevo kiederti alcune delucidazioni:
    1)In pratica, se io per esempio definisco una variabile con nome szName=3 e lancio i 2 processi, (in ordine il processo 1 e poi il processo 2) , il secondo processo dovrebbe acquisire una variabile con nome szName e valore 3 ?.......

    2)potresti in caso modificare quel codice da te postato in modo da dare in ingresso una matrice al proesso1 il quale la salverà in una shared memory) ed il secondo processo in modo che restituisca la matrice letta dalla shared memory.
    Scusa se chiedo troppo, ma non voglio approfittarne, bensì sono incapace di farlo in quanto ho usato c++ pocchissime volte.(mi serve qsto codice xke devo richiamarlo da un programma Matlab)
    GRAZIE!!!,-)
  • Re: Shared memory(memoria condivisa)

    Io non posso modificare quel codice semplicemente perche è fuori dalle regole di un forum. Mi dispiace ma + di così non posso aiutarti. Magari aspetta qualcun altro che sia + generoso. Tu chiedi aiuto su C++ ma di C++ io non ho visto niente nei tuoi post. Il secondo processo riceve un blocco di memoria e sta al secondo processo gestirlo come crede. Non riceve variabili ma solo blocchi di memoria privi di senso (almeno che non li si dà un senso).
  • Re: Shared memory(memoria condivisa)

    Ho creato questocodice, però mi restituisce 2.Sapresti dirmi il perchè?

    Posto il codice da me creato:
    ----------------------------------------------------------------------------------
    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    #include <tchar.h>

    #define BUF_SIZE 256
    TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
    TCHAR szMsg[]=TEXT("Message from first process.");

    BOOL APIENTRY DllMain( HANDLE hModule,
    DWORD ul_reason_for_call,
    LPVOID lpReserved
    )
    {
    return TRUE;
    }

    extern "C" __declspec(dllexport) int tmain()
    {
    HANDLE hMapFile;
    LPCTSTR pBuf;

    hMapFile = CreateFileMapping(
    INVALID_HANDLE_VALUE , // use paging file
    NULL, // default security
    PAGE_READWRITE, // read/write access
    0, // maximum object size (high-order DWORD)
    BUF_SIZE, // maximum object size (low-order DWORD)
    szName); // name of mapping object

    if (hMapFile == NULL)
    {
    _tprintf(TEXT("Could not create file mapping object (%d).\n"),
    GetLastError());
    return 2;
    }
    pBuf = (LPTSTR) MapViewOfFile(
    hMapFile, // handle to map object
    FILE_MAP_ALL_ACCESS, // read/write permission
    0,
    0,
    BUF_SIZE);

    if (pBuf == NULL)
    {
    _tprintf(TEXT("Could not map view of file (%d).\n"),
    GetLastError());

    CloseHandle(hMapFile);

    return 1;
    }


    CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
    _getch();

    UnmapViewOfFile(pBuf);

    CloseHandle(hMapFile);

    return 0;
    }
    ---------------------------------------------------------------------------------------------
  • Re: Shared memory(memoria condivisa)

    
    if (hMapFile == NULL)
    {
    _tprintf(TEXT("Could not create file mapping object (%d).\n"),
    GetLastError());
    return 2;
    }
    
    codice d'errore?
  • Re: Shared memory(memoria condivisa)

    Mi sapresti dire perchè perche risulta hMapFile == NULL???
    in realtà non dovrebbe restituirmi 0 in quanto dovrebbe copiare la stringa "Message from first process." ??
  • Re: Shared memory(memoria condivisa)

    Codice d'errore da GetLastError?
    Come lo stai chiamando sta funzione e da dove.
  • Re: Shared memory(memoria condivisa)

    La chiamo richiamo da matlab con il seguente codice:
    ---------------------------------------
    loadlibrary('SumDLL','General.h')
    libfunctions SumDLL -full
    mem1=calllib ('SumDLL','tmain')
    a=libisloaded('SumDLL');
    unloadlibrary SumDLL
    ----------------------------------
  • Re: Shared memory(memoria condivisa)

    Per quello che continuo a dirti: Che codice di errore ti da GetLastError dentro sto blocco di codice. Quello ci dirà perche il MMF non può essere creato.
  • Re: Shared memory(memoria condivisa)

    Fatto due proggetti prova. Uno dll e l'altro exe. Nessun problema a creare il MMF. Non so se matlab ti permette di creare dei MMF all'interno del suo spazio virtuale.
  • Re: Shared memory(memoria condivisa)

    Il codice è 5;
  • Re: Shared memory(memoria condivisa)

    ERROR_ACCESS_DENIED
    5 (0x5)
    Accesso negato da parte di Matlab. Come sospettavo. Niente da fare devi trovare altri metodi.
  • Re: Shared memory(memoria condivisa)

    Ok, grazie!!!
    avresti un consiglio su qualke metodo alternativo?
    Il mio obiettivo finale è quello di: Data una matrice A generata in matlab, renderla acquisibile da un programmino c++ (tale programmino verrà richiamato da un hardware fpga collegato sulla ram del pc).
    Basterebbe avere 2 programmi, uno che scrive sulla ram una matrice passatagli in ingresso e l' altro che simultaneamente legga sulla ram.
  • Re: Shared memory(memoria condivisa)

    Siccome Matlab può chiamare DLL fatte in C dovresti vedere se riesce a passare anche dati (meglio strutture o array) e come. Se si allora dalla Dll si potrebbe mandare un WM_COPYDATA all'altro programma con i dati della matrice. Una volta che il programma ha i dati poi non ho idea come scriverli sul hardware. Se li manda tramite porta seriale (fisica o virtuale). Cmq non stiamo parlando di programmini quì e di certo non avendo tutto sotto mano diventa dificile anche consigliarti. Ti posso mandare dei esempi di utilizzo di WM_COPYDATA oppure apertura porte seriali ma cmq dovresti sapere cosa stai faccendo.

    Quì ho trovato qualcosa.
    http://www.mathworks.com/help/techdoc/matlab_external/f42387.html

    Ecco cosa dice sulle matrici
    
    If the library function uses single subscript indexing to reference a two-dimensional matrix, keep in mind that C programs process matrices row by row while MATLAB processes matrices by column. To get C behavior from the function, transpose the input matrix before calling the function, and then transpose the function output.
    
Devi accedere o registrarti per scrivere nel forum
30 risposte