Shared memory(memoria condivisa)

di il
30 risposte

30 Risposte - Pagina 2

  • Re: Shared memory(memoria condivisa)

    Un esempio di come passare una matrice
    
    Passing Two Dimensional MATLAB Arrays to C Functions
    
    All MATLAB data is stored columnwise, and MATLAB uses one-based indexing for subscripts. MATLAB uses these conventions because it was originally written in Fortran. To demonstrate how this may affect your MATLAB data when using C functions, create the following matrix:
    
    m=1:12;
    m=reshape(m,4,3)
    dims = size(m)
    
    Matrix m is a 4-by-3 array containing:
    
    m =
         1     5     9
         2     6    10
         3     7    11
         4     8    12
    
    dims =
         4     3
    
    You might need to transpose MATLAB arrays before passing them to a C function since C assumes a row by column format. The print2darray function in the shrlibsample library shows this. Here is the C function:
    
    EXPORTED_FUNCTION void print2darray(double my2d[][3],int len)
    {
        int indxi,indxj;
        for(indxi=0;indxi<len;++indxi) 
        {
            for(indxj=0;indxj<3;++indxj)
            {
                mexPrintf("%10g",my2d[indxi][indxj]);
            }
            mexPrintf("\n");
        }
    }
    
    The first argument is a two dimensional array. The len argument is the number of rows. The function displays each element of the matrix. Using matrix m:
    
    calllib('shrlibsample','print2darray',m,4)
    
    MATLAB displays:
    
             1         2         3
             4         5         6
             7         8         9
            10        11        12
    
    You must transpose m to get the desired result:
    
    calllib('shrlibsample','print2darray',m',4)
    
    Now MATLAB displays:
    
             1         5         9
             2         6        10
             3         7        11
             4         8        12
    
    
  • Re: Shared memory(memoria condivisa)

    Grazie,
    più semplicemente potrebbero bastarmi 2 programmi:
    1) scrivi matrice su ram.
    2)leggi qlla matrice da ram.
    senza chiamare in ballo porte o alto, basterebbe solo qsto.
    ---------------------------------------------------------------------------
    Stavo pensando:
    Creando un programma c++ che prima richiama il mio programma Matlab(che crea la matrice) e poi crea la shared Memory (e non richiamare il programma c da Matlab), risolverei il problema datomi da getlasterror()?
    che ne dici?
  • Re: Shared memory(memoria condivisa)

    Grazie, mi hai letto nel pensiero!!!
  • Re: Shared memory(memoria condivisa)

    Grazie, mi hai letto nel pensiero!!!
  • Re: Shared memory(memoria condivisa)

    Un programma C non può chiamare un file.m di Matlab. Dovresti lanciare tu Matlab x la creazione della Matrice. se questa matrice cambia sempre e i dati sono in continuo aggiornamento la soluzione potrebbe essere:
    1) Crea un ciclo dentro il file .m x la generazione dei dati
    2) Una volta generati dei dati chiama una funzione di una dll C che si prende carico dei dati
    3) La dll chiama WM_COPYDATA x trasferire il contenuto ad un exe.
    4) sto exe manda i dati non so dove.
    5) ritorna al punto 2 e così via.
  • Re: Shared memory(memoria condivisa)

    Essempio di utilizzo di WM_COPYDATA. Questo sarà l'exe che riceve i dati.
    
    typedef struct
    {
    	int numRows;
    	int numColumns;
    	int **arrayData;
    }passedData;
    
    BOOL CCopyDataTestDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
    {
    	// TODO: Add your message handler code here and/or call default
    
    	CString m_str;
    	passedData *ptr = static_cast<passedData *>(pCopyDataStruct->lpData);
    	int i = 0;
    	int j = 0;
    	for(i = 0; i < ptr->numRows; i++)
    	{
    		for(j = 0; j < ptr->numColumns; j++)
    		{
    			m_str.Format(L"%d\t",ptr->arrayData[i][j]);
    		}
    	}
    	return true;
    }
    
  • Re: Shared memory(memoria condivisa)

    Ciao, ho creato l' exe delle funzioni che creano la shared memory(quelle linkate da te all' inizio) ed ho riscontrato 2 problemi:
    1)il dos resta aperto per un istante e poi si chiude.
    2)Sono riuscito ad intravedere che ritorna sempre GetLastError=5
    Mi sembra di poter dedurre che GetLastError=5 non dipende da matlab, ma non riesco a capire da cosa dipenda!!!!!!!!!!
    Io credo che capito da dove derivi l' errore tali funzioni siano richiamabili da Matlab senza alcun problema, oppure da Matlab potrei richiamre non le funzioni che carico nella Dll ma solo i .exe.
  • Re: Shared memory(memoria condivisa)

    Non so come crei tu le dll o altro ma i progetti che ho fatto io funzionano perfettamente. Nessun errore.

    http://rapidshare.com/files/433099519/Test.zi

    http://rapidshare.com/files/433099850/Projects.ra
  • Re: Shared memory(memoria condivisa)

    Il mio project è formato dai seguenti 4 file:
    StdAfx.cpp (source file)
    #include "stdafx.h"
    StdAfx.h (Header file file)
    #if !defined(AFX_STDAFX_H__2D715934_5333_4753_84BB_1FBC870854B2__INCLUDED_)
    #define AFX_STDAFX_H__2D715934_5333_4753_84BB_1FBC870854B2__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    
    // Insert your headers here
    #define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
    
    #include <windows.h>
    
    // TODO: reference additional headers your program requires here
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
    
    #endif // !defined(AFX_STDAFX_H__2D715934_5333_4753_84BB_1FBC870854B
    SumDLL.cpp (source file)
    #include "stdafx.h"
    #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 1;
       }
       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 2;
       }
    
       
       CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
        _getch();
    
       UnmapViewOfFile(pBuf);
    
       CloseHandle(hMapFile);
    
       return 3;
    }
    
    
    
    
    
    SumDLL.h (Header file)
    #ifndef _SUM_DLL_H_
    #define _SUM_DLL_H_
    
    
    #ifdef SUMDLL_EXPORTS
    #define SUMDLL_extern_C __declspec(dllexport)
    #else
    #define SUMDLL_extern_C __declspec(dllimport)
    #endif
    
    // This class is exported from the SumDll.dll
    
    extern "C"
    { 
    SUMDLL_extern_C int _tmain();
    
    
    }
    #endif //_SUM_DLL_H_
    General.h
    #ifndef _SHELL_H_
    #define _SHELL_H_
    
    
    #ifndef EXPORT
    #define EXPORT
    #endif
    
    EXPORT  int _tmain();
    
    
    #endif //_SHELL_H_
  • Re: Shared memory(memoria condivisa)

    Ho capito che l' errore GETLASTERROR()=5 è dato dal sistema operativo VISTA!!!!
    L ho fatto girare su windows xp e non mi dà getlasterror=5, ma lanciando il processo 1 mi visualizza solo la schermata prompt nera la quale la si chiude premendo il tasto invio
  • Re: Shared memory(memoria condivisa)

    Cosa ti aspettavi uno che ti dicesse ciao? Il programma fà ciò per cui è stato programmato ne più ne meno. Non riesco a capire perche ti inpunti così nel cercare di trovare una soluzione in 5 minuti. Non si diventa programmatori di C++ in un ore di Visual Studio come non si diventa programmatori di matlab leggendo un ora la guida. Se hai dei problemi su codice (scritto da te o almeno che comprendi) che dovrebbe fare una cosa ma non lo fà allora sono ben felice di aiutarti ma non sono disposto a scriverti un programma completo su MMF o interfacciamento di programmi. Ti posso mandare pezzi di codice si ma se non sai come legarli insieme siamo punto e a capo.
  • Re: Shared memory(memoria condivisa)

    Cambia da
    
    TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
    
    a
    
    TCHAR szName[]=TEXT("Local\\MyFileMappingObject");
    
    per farlo funzionare su Vista.
  • Re: Shared memory(memoria condivisa)

    RIECCOMI!!:-)
    ho fatto girare gli exe creati in c ed è tutto o.k.
    Poi ho creato una 2 Dll in modo tale da poterle richiamare da matlab.
    Quando pero richiamo le DLL da Matlab mi da problemi.(la funzione di creazione della shared memory la ho chiamata (Wmain), quella di lettura della shared memory l ho invece chiamata(Rmain).
    In pratica, lancio matlab con il seguente codice:
    
    clear 
    loadlibrary('SumDLL','General.h')
    libfunctions SumDLL -full
    risultato=calllib ('SumDLL','Wmain')
    a=libisloaded('SumDLL');
    unloadlibrary SumDLL
    
    e crea la shared memory.
    poi rilancio un altro file matlab con seguente codice:
    
    clear 
    f=8;
    d=2;
    loadlibrary('SumDLL','General.h')
    libfunctions SumDLL -full
    risultato=calllib ('SumDLL','Rmain')
    a=libisloaded('SumDLL');
    unloadlibrary SumDLL
    
    Il primo file mi crea sicuramente la memoria condivisa in quanto ho messo come return il valore 3 in caso la memoria venga creata ed ineffetti il programma restituisce tale valore.Se lancio dopo il secondo file matlab( quello che lancia la funzione di lettura) mi da come errore il seguente:
    "Could not open file mapping object ".

    A mio avviso il problema è dovuto al fatto che la memoria condivisa funziona solo se entrambi i processi sono in esecuzione. Matlab pero credo non faccia rimanere il primo processo in esecuzione.Infatti se lancio l' exe di creazione della shared memory (e lascio il programma di creazione della shared memory in esecuzione) e poi lancio il programma matlab di lettura funziona.
    Sapreste indicarmi una soluzione per fare in modo che il primo processo ( quello di creazione della shared memory) resti in esecuzione quando è lanciato da matlab?
    Grazie.
  • Re: Shared memory(memoria condivisa)

    Unloadlibrary dovrebbe essere usata a fine procedura a mio aviso. Quindi lo carichi una volta e lo scarichi una volta. Tu fai load/unload ogni volta x ogni funzione.
  • Re: Shared memory(memoria condivisa)

    Ci avevo pensato anche io ed infatti ho creato una memoria condivisa unica ed eseguito il seguente file matlab, ma nulla, sempre stesso errore:"Could not open file mapping object".
    
    loadlibrary('SumDLL','General.h')
    libfunctions SumDLL -full
    risultato=calllib ('SumDLL','Wmain')
    risultato2=calllib ('SumDLL','Rmain')
    a=libisloaded('SumDLL');
    unloadlibrary SumDLL
    
Devi accedere o registrarti per scrivere nel forum
30 risposte