2010-08-11 7 views
2

Je pense avoir enfin compris les bases de la bibliothèque boost: interprocess, et je l'ai utilisé avec succès pour traiter des classes relativement simples qui contiennent quelques variables membres sont tous les types de données standard. Cependant, je suis maintenant confronté au problème de pousser une classe plutôt complexe dans la mémoire partagée interprocessus et je n'ai aucune chance du tout. J'espère que quelqu'un ici peut aider (ou peut me diriger vers une solution alternative). Dépouillant jusqu'à ce que j'espère sont les bases, j'ai quelque chose le long de ces lignes:Boost :: Interprocess avec des classes imbriquées complexes

// these first two classes are from the Gnu Scientific Library, so I can't 
// (or won't) be able to mess with the definition of these structures. 
typedef struct 
{ 
    size_t size1; 
    size_t size2; 
    size_t tda; 
    double * data; 
    gsl_block * block; 
    int owner; 
} gsl_matrix; 

typedef struct 
{ 
    size_t size1; 
    size_t size2; 
    size_t tda; 
    int * data; 
    gsl_block_int * block; 
    int owner; 
} gsl_matrix_int; 

class MyNumbersClass 
{ 
    gsl_matrix_int* m_pIntMatrix; 
    gsl_matrix*  m_pDblMatrix; 
    unsigned int iVal1; 
    unsigned int iVal2; 
} 

class MyOtherDataClass 
{ 
    std::vector<int> m_vInputs; 
    std::vector<double> m_vOutputs; 
    std::string m_sTitle; 
    bool m_bCorrect; 
} 

class SharedClass 
{ 
    MyNumbersClass* m_pFirstNumbers; 
    std::vector<double> m_vDblData; 
    std::vector<MyOtherDataClass> m_vOtherData; 
} 

Ce que je dois faire est de créer un vecteur d'objets SharedClass dans l'espace mémoire interprocessus afin que plusieurs processus peuvent accéder aux données . Peu importe ce que j'essaie, je n'arrive pas à trouver une solution. Il semble qu'il devrait y avoir un moyen plus simple que de faire de chaque variable membre une version interprocess (interprocess :: vector, interprocess :: string, offset_ptr, etc), mais peut-être pas. Et même alors, je ne suis pas sûr de savoir comment gérer tous les allocateurs et autres, sans parler des structures de la bibliothèque GSL.

Aide!

Répondre

0

Vous avez un problème avec les conteneurs STL. Comme vous l'avez deviné, vous devez utiliser les conteneurs boost :: interprocess.

Par exemple, en utilisant des chaînes, voir my answer here. Pour le vecteur, voir this.

Vive

Questions connexes