IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

Problème d'instanciation multiples


Sujet :

C++/CLI

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Par défaut Problème d'instanciation multiples
    J'ai programmé un wrapper C++/CLI pour utilise berkeleydb. Ce wrapper fonctionne très bien mais j'ai remarqué hier un soucie qui ne viens pas de mon code.

    J'ai une class static , qui contiens les objets des bases de données berkeley donc qui utilise mon wrapper, cette class contient aussi une foncton voici comment ce passe l'initalisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    /// <summary>
    /// Objet de la base de donn‚es de liens
    /// </summary>
    public static BerkeleyQueueManagement db_hostqueues = new BerkeleyQueueManagement("./Env_dir_db_hostqueues",
    "db_hostqueues.db",
    Convert.ToUInt32(ConfigurationManager.AppSettings["CacheGigabyte"]),
    Convert.ToUInt32(ConfigurationManager.AppSettings["CacheSize"]),
    Convert.ToInt32(ConfigurationManager.AppSettings["CacheNumber"]),
    1,
    "logdb_hostqueues.txt",
    Convert.ToUInt32(ConfigurationManager.AppSettings["TxnTimeout"]),
    Convert.ToUInt32(ConfigurationManager.AppSettings["TxnMax"]));
     
    etc....

    Puis l'initialisation des bases de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    /// <summary>
    /// Initialise les bases de données
    /// </summary>
    public static void Init()
    {
    if (!db_hostqueues.OpenDatabase())
    throw new Exception("Impossible de d‚marrer l'application car HostQueue ne peut pas ˆtre ouverte");
     
    if (!db_hostdictionary.OpenDatabase())
    throw new Exception("Impossible de d‚marrer l'application car HostDictionnary ne peut pas ˆtre ouverte");
    if (!db_waitqueue.OpenDatabase())
    throw new Exception("Impossible de d‚marrer l'application car WaitQueue ne peut pas ˆtre ouverte");
    if (!db_readyqueue.OpenDatabase())
    throw new Exception("Impossible de d‚marrer l'application car ReadyQueue ne peut pas ˆtre ouverte");
    }

    A ce niveau tout vas bien rien de bien méchant sauf que je ne peux pas initialiser toutes mes bases de données

    si je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    /// <summary>
    /// Initialise les bases de donn‚es
    /// </summary>
    public static void Init()
    {
    if (!db_hostqueues.OpenDatabase())
    throw new Exception("Impossible de d‚marrer l'application car HostQueue ne peut pas ˆtre ouverte");
    }
    sa marche !!!


    Si je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /// <summary>
    /// Initialise les bases de donn‚es
    /// </summary>
    public static void Init()
    {
    if (!db_hostqueues.OpenDatabase())
    throw new Exception("Impossible de d‚marrer l'application car HostQueue ne peut pas ˆtre ouverte");
    if (!db_hostdictionary.OpenDatabase())
     
    throw new Exception("Impossible de d‚marrer l'application car HostDictionnary ne peut pas ˆtre ouverte"); 
    }

    Plantage de l'application et berkeleydb qui me dit que le paramètre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    berleydb DbEnv::set_tx_max
    est invalide

    Dès que j'essaie d'ouvrir plusieurs base de données sa plante.

    Je me demande donc si cela ne viens pas de mon code C++ ? Je fais la liaison avec la dll de berkeleydb par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #pragma comment (lib, "libdb47.lib")
    Je ne vois pas ce qui cloche dans mon code donc je suppose que peut être sa viens de la compilation mais je ne trouve pas non plus ce qui cloche a ce niveau

    Merci de votre aide

  2. #2
    Membre très actif
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Par défaut
    Après une bonne centaines de testes et des recherches sur le net notamment la lecture de cette page
    http://www.mathematik.uni-ulm.de/hel.../mp/intro.html

    je peux que le problème ne viens pas de mon code a proprement parlé si le fait de renseigner pour chaque instance du wrapper le paramtre tx_max (nombre max de transactions ouvertes en meme temps) fait planter l'application c'est a cause du fonctionnement du pool mémoire de berkeleydb.

    Les transactions ce déroulent dans ce pool, donc ce qui ce passe c'est que txn_max c'est pout toutes les instances de berkeleydb ouverte dans une application, il faut donc mettre 0 a txn_max quand je crée les autres objets de base de données.

  3. #3
    Membre très actif
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Par défaut
    Le problème est bien plus compliqué de ce que j'ai trouvé en fait mon problème ne viens ni de mon code C# ni de mon code C++ mais de C++/CLI . J'ai écrit un petit prog C++ qui reprend les classes C++ que j'ai codé et tout roule niquel, il n'y a aucun soucie dans mon code C# donc le problème c'est C++/CLI qui provoque des problèmes d'accès mémoire (voir le doc attaché). Je ne trouve pas de solution par contre pour sa.

    Autant dire que j'ai un sacré problème, je pense faire carrement un serveur C++ avec qui mon application parlera par socket !!!

    Qu'en pensez vous ???


  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    je ne pense pas que ca vienne du C++/CLI mais de ta facon de gérer le managé/natif

    tu as un programme minimal qui reproduit l'erreur ?

  5. #5
    Membre très actif
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Par défaut
    En fait j'ai fait une petite applie C# qui utilise mon wrapper le résultat est super marrant . Impossible d'ouvrir deux db en meme temps !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    static void Main(string[] args)
    {
    BerkeleyDB db = new BerkeleyDB("teste.db", 0, 1024*10, 1, 1, "err.txt", "./Env_dir", 1000000 * 5, 600000);
    BerkeleyDB db1 = new BerkeleyDB("teste2.db", 0, 1024*10, 1, 1, "err2.txt", "./Env_dir2", 1000000, 0);
     
    db.OpenDatabase();
    db1.OpenDatabase();
    for (uint i = 0; i < 10; i++)
    {
    Console.WriteLine(i);
    db.AddData(i, new ParamsStruct(10, DateTime.Now, 153));
    db1.AddData(i, new ParamsStruct(10, DateTime.Now, 153));
    }
     
    for (uint i = 0; i < 10; i++)
    {
    BerkeleydbWrapper.ParamsStruct a = db.GetData(i, true);
    BerkeleydbWrapper.ParamsStruct ab = db1.GetData(i, true);
    Console.WriteLine("Waittime : {0}, Datetime : {1}, Dowloaded : {2}", a.waittime, a.lastaccess, a.downloaded);
    Console.WriteLine("Waittime : {0}, Datetime : {1}, Dowloaded : {2}", ab.waittime, ab.lastaccess, ab.downloaded);
    }
     
    Console.ReadLine();
    }


    la sortie de l'application donne (voir doc attaché)

    En fait ce qui ce passe que la première db n'est pas créé , donc db et db1 pointe vers la meme db qui est db1 .

    Bref je ne comprend plus rien, je suis pommé la

  6. #6
    Membre très actif
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Par défaut
    Après de nombreux testes je doit avouer que je ne trouve pas ou j'ai pu faire une erreur avec une db sa tourne niquel, mais avec deux sa pose problème .

Discussions similaires

  1. Problème d'instanciation multiple de static dans dll
    Par fredoule2k dans le forum Langage
    Réponses: 7
    Dernier message: 10/10/2009, 13h56
  2. Réponses: 22
    Dernier message: 05/07/2005, 00h04
  3. Problème de MouseListener multiples
    Par pierre.zelb dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 23/06/2005, 11h18
  4. Problème d'ajout multiples dans un BDD Access
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/05/2004, 13h34
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo