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

QxOrm Discussion :

Pointeurs IxParameter dans QxService et Serialization


Sujet :

QxOrm

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Pointeurs IxParameter dans QxService et Serialization
    Bonjour,

    Je suis entrain de débogger le test "QxClientServer" dans QxOrm 1.2.6 beta 3 avec Qt 5.1, Qt Creator 2.7.2, MinGW 2.8 32bit, Boost 1.54 avec C++11 activé par défaut.

    Tout compile très bien et fonctionne très bien incluant le test de QxBlog. Quand on arrive au test QxClientServer la compilation se termine avec succès mais lors d'une requête "get_current_date_time" il y a une erreur:

    [QxOrm] qx::QxArchive<T>::toByteArray() -> Serialization error : 'unregistered class - derived class not registered or exported'
    ASSERT: "bSerializeOk" in file include/QxSerialize/../../inl/QxSerialize/QxArchive.inl, line 214
    J'ai retracé cette erreur à la procédure de sérialization qx_save de QxTransaction, en particulier lorsque le serveur retourne le output:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       ar << boost::serialization::make_nvp("input_parameter", pInputParameter);
       ar << boost::serialization::make_nvp("output_parameter", pOutputParameter);
    Il semblerait que output_transaction_size soit de 0, et que output_parameter soit vide. Donc, j'ai vérfié si le server_infos_output était bel et bien calculé et c'est le cas. Par contre, il n'est pas introduit dans QxService correctement, parce que la fonction suivante semble invalide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void server_infos::get_current_date_time()
    {
       server_infos_output_ptr output = server_infos_output_ptr(new server_infos_output());
       output->current_date_time = QDateTime::currentDateTime();
       setOutputParameter(output);
       setMessageReturn(true);
    }
    De ce que je vois, jusqu'à setOutputParameter(output), tout est beau. J'ai regardé dans QxServices<INPUT, OUTPUT> et on retrouve seulement ces deux fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       INPUT_ptr getInputParameter() const    { return boost::static_pointer_cast<INPUT>(m_pInputParameter); }
       OUTPUT_ptr getOutputParameter() const  { return boost::static_pointer_cast<OUTPUT>(m_pOutputParameter); }
    Alors, il n'y a aucune fonction setOutputParameter() sauf dans IxService

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       void setInputParameter(IxParameter_ptr p)                            { m_pInputParameter = p; }
       void setOutputParameter(IxParameter_ptr p)                           { m_pOutputParameter = p; }
    Les fonctions prennent bel et bien un IxParameter_ptr en paramètre, alors c'est peut-être pour cette raison qu'on arrive pas a sérializer server_infos_output_ptr.

    Est-ce que c'est voulu que ce QxService<INPUT,OUTPUT> ne contienne pas setInputParameter et setOutputParameter, et que QxTransaction ne se réfère qu'à IxParameter_ptr sans static_pointer_cast ? Je sais que QxTransaction n'est pas capable d'accéder au output parameter mais je ne comprend pas comment ce code a bien pu déjà fonctionner si j'ai trouvé ici une erreur aussi globale. Je semble près de la solution mais je suis un peut perdu ici.

    Merci

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut


    mais je ne comprend pas comment ce code a bien pu déjà fonctionner
    Oui ce code fonctionne très bien sur tous les systèmes : Windows, Linux et MacOS.

    [QxOrm] qx::QxArchive<T>::toByteArray() -> Serialization error : 'unregistered class - derived class not registered or exported'
    ASSERT: "bSerializeOk" in file include/QxSerialize/../../inl/QxSerialize/QxArchive.inl, line 214
    Cette erreur provient du module boost::serialization.
    J'ai l'impression que tes classes ne sont pas enregistrées dans le contexte QxOrm, et donc ne sont pas enregistrées non plus dans le contexte boost::serialization.
    Je pense que ton soucis est lié au chargement des composants : la DLL qui contient les classes de service + paramètres n'est pas chargée en mémoire.

    Ça correspond à ce lien du tutoriel : http://marty-lionel.developpez.com/t...tserver/#LII-C
    En gros c'est pour faire croire au linker qu'il est nécessaire de charger le composant. Et le tuto explique aussi que pour une vraie appli, ça peut être intéressant à ce niveau de mettre en place un système de plugins.

    Essaye de mettre un point d'arrêt dans une fonction qx::register_class<T> côté serveur : je pense que tu n'y passes jamais (et tu devrais y passer au chargement de la DLL).
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Alors c'est peut-être GCC 4.8 qui provoque une erreur. Si la DLL n'était pas chargé alors je n'aurais probablement pas pu calculer le server_output mais c'est bien le cas. Dans QxTransaction::executeServer(), j'ai modifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_pServiceInstance->onAfterProcess(m_pOutputParameter);
    où IxService.h contient maintenant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       virtual void onAfterProcess(boost::shared_ptr<IxParameter>& ixp)       { ; }
    et le fichier server_infos.h du dll contient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       void onAfterProcess(qx::service::IxParameter_ptr& ixp) { qDebug() << boost::static_pointer_cast<server_infos_output>(ixp)->current_date_time.toString("yyyyMMddhhmmsszzz"); }
    la compilation me retourne maintenant:

    "20130629181606538"
    [QxOrm] qx::QxArchive<T>::toByteArray() -> Serialization error : 'unregistered class - derived class not registered or exported'
    ASSERT: "bSerializeOk" in file include/QxSerialize/../../inl/QxSerialize/QxArchive.inl, line 214
    Donc l'heure est bien calculée et transmis, et que le type existe puisque IxService est transformé en type server_infos à travers l'appel à QxClassX::invoke.

    Je retrace l'erreur à cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       ar << boost::serialization::make_nvp("output_parameter", pOutputParameter);
    La librairie boost::serialization ne fait pas la conversion polymorphique vers la class derived avec un pointeur base*. Du moins, c'est le cas dans la configuration actuelle que j'utilise. Je suis entrain d'étudier les codes sources de boost::serialization pour voir ce qui cloche.

    D'ailleurs, je vous envoie mes remerciements pour avoir développé une librairie aussi puissante. Je suis convaincu qu'elle sera un incontournable dans un future près.

    Merci !

    Etienne Cimon

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    je vous envoie mes remerciements pour avoir développé une librairie aussi puissante.
    Merci, c'est sympa

    As-tu essayé avec boost 1.53 ? Car la version 1.54 ne semble pas être sortie officiellement.
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Mon build fonctionne maintenant, avec Qt 5.1 / Gcc 4.8 32bit de

    http://download.qt-project.org/offic...exe.mirrorlist

    J'utilise la boost la plus récente (1.55) mais 1.54 fonctionne certainement. J'utilise
    CONFIG += QX_NO_QT_GUI
    QMAKE_CXXFLAGS += -std=c++11

    Puisque QxOrm est compilé avec QX_NO_QT_GUI j'ai dû ajouter QT += widgets dans le .pro du test.

    De plus, la compilation QxOrm sous gcc 4.7 ou 4.8 retournait des erreurs du compilateur, j'ai dû modifier la ligne suivante ainsi:

    win32-g++: QMAKE_LFLAGS += -Wl,-export-all-symbols -Wl,-enable-auto-import

    qmake.exe semble aussi vouloir modifier les chemins de -include include/ à -include debug/ ou -include release/, je dois faire un remplacement rapide dans le MakeFile.debug à tous les build pour rétablir les répertoires appropriés.

    Au final pour mon problème, c'était boost 1.54 beta qui implémentait mal is_abstract<T> et le type IxParameter ne s'inscrivait pas correctement dans boost serialization par conséquent. J'ai fait un SVN update avec le dernier commit du 1.55 le tout est réglé. Ça m'a donné l'occasion d'étudier le code de QxOrm mais j'ai quelques questions:

    Pourquoi avez-vous inclus QxBoostSerializeRegisterHelper / IxBoostSerializeRegisterHelper ? Que fait-il ? Aussi, qu'est-ce que _QX_USE_MODIFY_BOOST_SERIALIZATION_EXPORT_HPP ? Il ne fonctionne pas nonplus

    Qu'est-ce qu'un "Repository" ? Pourquoi serait-il mieux de s'en servir (ou pas) ?

    Pourquoi ne pas implémenter QSslSocket pour l'encryption plutôt que QxSimpleCrypt ?

    Merci !

    - Etienne Cimon

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Mon build fonctionne maintenant, avec Qt 5.1 / Gcc 4.8
    ...
    Au final pour mon problème, c'était boost 1.54 beta qui implémentait mal is_abstract<T> et le type IxParameter ne s'inscrivait pas correctement dans boost serialization par conséquent. J'ai fait un SVN update avec le dernier commit du 1.55 le tout est réglé.


    Je mets donc ce sujet en [Résolu].

    Pourquoi avez-vous inclus QxBoostSerializeRegisterHelper / IxBoostSerializeRegisterHelper ? Que fait-il ? Aussi, qu'est-ce que _QX_USE_MODIFY_BOOST_SERIALIZATION_EXPORT_HPP ? Il ne fonctionne pas nonplus
    Pendant la phase de développement de la bibliothèque QxOrm, l'une des plus grosses problématiques a été de faire fonctionner correctement boost::serialization (à l'époque version 1.38) sur tous les environnements de test avec des modules partagés (.DLL sous Windows, .SO sous Linux, etc...).
    boost::serialization implémente le pattern singleton mais il posait des problèmes avec les DLL sous Windows.
    Du coup, les classes QxBoostSerializeRegisterHelper / IxBoostSerializeRegisterHelper et la macro _QX_USE_MODIFY_BOOST_SERIALIZATION_EXPORT_HPP sont un peu les résidus de tous ces essais.

    Qu'est-ce qu'un "Repository" ? Pourquoi serait-il mieux de s'en servir (ou pas) ?
    C'est un pattern que tu retrouves par exemple avec les langages C# et Java.
    Tape "Pattern Repository" sous Google : tu trouveras tes réponses

    Pourquoi ne pas implémenter QSslSocket pour l'encryption plutôt que QxSimpleCrypt ?
    QSslSocket permet de crypter les données qui transitent sur socket.
    QxSimpleCrypt permet de crypter les données mais pas simplement au niveau socket, peu importe où dans ton programme (par exemple, si tu veux crypter un mot de passe avant de le stocker en BDD, c'est possible avec QxSimpleCrypt).
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer Pointeur Souris dans anim Flash
    Par johan06 dans le forum Flash
    Réponses: 2
    Dernier message: 28/06/2010, 14h31
  2. [Débutant] Pointeur FILE dans une fonction
    Par Dexter00 dans le forum C
    Réponses: 8
    Dernier message: 29/08/2006, 21h37
  3. passage pointeur NULL dans une fonction
    Par reptils dans le forum C
    Réponses: 4
    Dernier message: 11/05/2006, 23h12
  4. Positionnement pointeur souris dans champ texte
    Par angelevil dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/03/2006, 12h58
  5. [MFC]recup pos pointeur curseur dans CEdit
    Par lucky dans le forum MFC
    Réponses: 3
    Dernier message: 08/09/2005, 10h47

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