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

wxWidgets Discussion :

Intégrer une IHM wxWidget dans une application C++


Sujet :

wxWidgets

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Par défaut Intégrer une IHM wxWidget dans une application C++
    Bonjour à tous,

    Je rencontre un problème lors de l'intégration d'une IHM développée avec wxWidget à l'intérieur d'une application c++ "classique".

    Je m'explique:

    J'ai développé une application serveur. J'instancie un objet serveur d'une classe serveur que j'ai également crée. Voici le code, extrêmement simple de mon application serveur ServeurApp.cpp:

    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
    27
    28
     
    #include <iostream.h>
    #include "serveur.h"
     
    #define PORT 12345
    #define MAX_CLIENTS 5
     
    int main(int argc, char **argv)
    {
           int ret;
           /*! Creation d'une instance de la classe serveur */
    	serveur *ServeurDLL = new serveur( PORT, MAX_CLIENTS );
    	/*! Initialisation du serveur */
    	if((ret = ServeurDLL->init()) != 0)
    	{
    	    printf("Erreur %i durant l'initialisation du serveur\n", ret);
    		return -1;
    	}
    	/*! Lancement du serveur */
    	if((ret = ServeurDLL->start()) != 0)
    	{
    	    printf("Erreur %i durant le lancement du serveur\n", ret);
    		return -1;
    	}
     
    	return 0;
     
    }

    D'un autre côté, j'ai également développé une IHM pour mon serveur. Pour cela j'ai utiliser wxWidget (c'est la première fois que je l'utilise). J'ai donc crée une classe "FenetreServeur" qui dérive de wxFrame dans laquelle je crée mes contrôles. Pour l'utiliser, j'ai crée un fichier IHMApp.cpp:

    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
     
     
    #include "main.h"
    #include "FenetreServeur.h"
     
    bool IHMApp::OnInit()
    {
     
       FenetreServeur *fenetre=new FenetreServeur();
     
       fenetre->Show();
     
       return true;
    }
     
    IMPLEMENT_APP(IHMApp);
    Les deux applications fonctionnent indépendament. Ce que j'aimerai, et que je n'arrive pas à faire, c'est de pouvoir créer mon objet fenetre dans le main de mon fichier ServeurApp.cpp afin d'utiliser mon IHM avec mon serveur. Pour cela, j'ai intégré les fichiers FenetreServeur.h et .cpp a mon projet serveur et j'ai modifié ma fonction main:

    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
    27
     
    int main(int argc, char **argv)
    {
           int ret;
     
           /*! Creation d'une instance de la classe serveur */
    	serveur *ServeurDLL = new serveur( PORT, MAX_CLIENTS );
     
           FenetreServeur *fenetre=new FenetreServeur();
           fenetre->Show();
     
    	/*! Initialisation du serveur */
    	if((ret = ServeurDLL->init()) != 0)
    	{
    	    printf("Erreur %i durant l'initialisation du serveur\n", ret);
    		return -1;
    	}
    	/*! Lancement du serveur */
    	if((ret = ServeurDLL->start()) != 0)
    	{
    	    printf("Erreur %i durant le lancement du serveur\n", ret);
    		return -1;
    	}
     
    	return 0;
     
    }
    Malheureusement, cela ne fonctionne pas... Auriez-vous des pistes? Pour info, j'utilise code::blocks sous GNU/Linux

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Je pense que tu dois prendre le problème dans l'autre sens : créer ton serveur dans la méthode d'initialisation de l'application wxWidget :
    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
    27
    28
    29
    30
    31
    32
    33
    34
     
    // dans class IHMApp déclarer un membre : serveur *m_ServeurDLL 
    IHMApp::IHMApp()
    :m_ServeurDLL(NULL)
    {}
    IHMApp::~IHMApp()
    {
       delete m_ServeurDLL;
    }
     
    bool IHMApp::OnInit()
    {
     
       FenetreServeur *fenetre=new FenetreServeur();
     
       fenetre->Show();
     
           int ret;
           /*! Creation d'une instance de la classe serveur */
    	m_ServeurDLL= new serveur( PORT, MAX_CLIENTS );
    	/*! Initialisation du serveur */
    	if((ret = m_ServeurDLL->init()) != 0)
    	{
    	    ::wxLogError("Erreur %i durant l'initialisation du serveur\n", ret);
    		return false;
    	}
    	/*! Lancement du serveur */
    	if((ret = m_ServeurDLL->start()) != 0)
    	{
    	    ::wxLogError("Erreur %i durant le lancement du serveur\n", ret);
    		return false;
    	}
       return true;
    }
    Pour vraiment bien faire, m_ServeurDLL pourrait être un pointeur intelligent ou rendre ta classe IHMApp non copiable

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Par défaut
    Salut!

    Merci de ta réponse. Cette solution pourrait marcher mais l'appel à la fonction start de ma classe serveur est blocant. En effet, c'est dans cette fonction que se trouve la boucle d'attente de connexion de mon serveur. Cette fonction ne retourne qu'en cas d'erreur, car normalement, le serveur n'est pas prévu pour s'arrêter. Du coup, la fonction OnInit ne retourne jamais "true" et mon IHM ne s'affiche jamais.

    Une idée serait peut être de faire du multithreading en lançant le serveur dans un thread. J'ai essayé en écrivant une classe dérivée de wxThread:

    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
    27
    28
    29
    30
    31
    32
    33
     
     
    #include "CThreadServeur.h"
    #include "serveur.h"
     
    #define PORT 12345
    #define MAX_CLIENTS 5
     
    CThreadServeur::CThreadServeur() : wxThread(wxTHREAD_DETACHED)
    {
    }
     
    void* CThreadServeur::Entry()
    {
      // tant que le thread peut continuer
        int ret;
    	/*! Creation d'une instance de la classe serveur */
    	serveur *ServeurDLL = new serveur( PORT, MAX_CLIENTS );
    	/*! Initialisation du serveur */
    	if((ret = ServeurDLL->init()) != 0)
    	{
    	    printf("Erreur %i durant l'initialisation du serveur\n", ret);
    		return NULL;
    	}
    	/*! Lancement du serveur */
    	if((ret = ServeurDLL->start()) != 0)
    	{
    	    printf("Erreur %i durant le lancement du serveur\n", ret);
    		return NULL;
    	}
     
      return NULL;
    }
    Dans ma fonction OnInit je crée une instance de cette classe et je la lance:

    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
     
     
    bool IHMApp::OnInit()
    {
     
       /** Instanciation de l'IHM*/
       FenetreServeur *fenetre=new FenetreServeur();
       fenetre->Show();
     
       /** Lancement du thread contenant le serveur*/
       CThreadServeur *thread_serveur = new CThreadServeur;
       thread_serveur->Create();
       thread_serveur->Entry();
     
       return true;
     
    }
    Dans ce cas, mon IHM est figée, car le thread doit se bloquer sur l'appel à start et ne pas laisser la main... J'ai essayé la méthode "Yield" sans plus de succès... Aurais-tu une idée ?

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Une petite erreur, ce n'est pas Entry qu'il faut appeler mais Run
    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
    bool IHMApp::OnInit()
    {
     
       /** Instanciation de l'IHM*/
       FenetreServeur *fenetre=new FenetreServeur();
       fenetre->Show();
     
       /** Lancement du thread contenant le serveur*/
       CThreadServeur *thread_serveur = new CThreadServeur;
       thread_serveur->Create();
       thread_serveur->Run();
     
       return true;
     
    }

  5. #5
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Par défaut
    Une petite erreur qui fait toute la différence!

    Cela semble fonctionner à présent!

    Merci beaucoup!

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  2. Réponses: 10
    Dernier message: 18/04/2007, 17h17
  3. Changer un caractère dans une chaîne contenue dans une phrase
    Par cirtey dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 07/03/2007, 16h16
  4. Réponses: 4
    Dernier message: 16/05/2006, 23h15
  5. Réponses: 11
    Dernier message: 06/12/2005, 08h23

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